《C基础PPT课件第十章 指针与引用数学》由会员分享,可在线阅读,更多相关《C基础PPT课件第十章 指针与引用数学(27页珍藏版)》请在金锄头文库上搜索。
1、第十章 指针与引用 1-2课程内容安排课程内容安排指针的概念。指针的概念。指针的运算。指针的运算。指向数组的指针。指向数组的指针。指向字符串的指针。指向字符串的指针。引用的定义和使用。引用的定义和使用。指针与引用的区别和应用。指针与引用的区别和应用。1-3指针的基本概念指针的基本概念 简单的说,指针是一个地址,其指向存储某一个数据的简单的说,指针是一个地址,其指向存储某一个数据的存储地址。此外,还有一个指针变量的概念,指针变量存储地址。此外,还有一个指针变量的概念,指针变量是一种特殊性质的变量。指针变量是把地址存放在一个是一种特殊性质的变量。指针变量是把地址存放在一个变量中,然后通过先找出地址
2、变量中的值(一个地址),变量中,然后通过先找出地址变量中的值(一个地址),再由此地址找到最终要访问的变量的方法,这就是指针再由此地址找到最终要访问的变量的方法,这就是指针变量及其访问方法,而地址变量就是指针。变量及其访问方法,而地址变量就是指针。1-4定义指针变量定义指针变量 前面内容提到了,指针是一种复合型的数据类型。与其前面内容提到了,指针是一种复合型的数据类型。与其他基本数据类型一样,使用指针之前也必须先定义指针他基本数据类型一样,使用指针之前也必须先定义指针变量。在变量。在C+中,定义指针变量的一般形式如下所示。中,定义指针变量的一般形式如下所示。类型标识符类型标识符 * 指针名指针名
3、;其中,其中,“*”表示这是一个指针变量;变量名为定义的表示这是一个指针变量;变量名为定义的指针变量名;类型标识符表示本指针变量指向数据的类指针变量名;类型标识符表示本指针变量指向数据的类型。例如,下面语句定义了一个指针变量型。例如,下面语句定义了一个指针变量int * p;上述语句表示上述语句表示p是一个指针变量,其值为某个整型变量是一个指针变量,其值为某个整型变量的地址,或者说的地址,或者说p指向一个整型变量。至于到底指向哪指向一个整型变量。至于到底指向哪一个整型变量,可以通过将某个变量的地址值赋给指针一个整型变量,可以通过将某个变量的地址值赋给指针p来决定。来决定。1-5初始化指针初始化
4、指针 定义了一个指针后,在使用此指针前,必须首先给它赋一个定义了一个指针后,在使用此指针前,必须首先给它赋一个合法的值。否则,程序中对指针的使用就有可能导致系统崩合法的值。否则,程序中对指针的使用就有可能导致系统崩溃。溃。C+中,读者可以在定义指针的同时通过初始化来给指中,读者可以在定义指针的同时通过初始化来给指针赋值,也可以在使用之前给指针赋值。一般来说,针赋值,也可以在使用之前给指针赋值。一般来说,C+中中在定义指针的同时初始化指针的形式如下所示。在定义指针的同时初始化指针的形式如下所示。数据类型数据类型 *指针名指针名=初始地址值初始地址值;例如,下面语句将变量例如,下面语句将变量a的内
5、存地址作为初始值赋予整型数的内存地址作为初始值赋予整型数据类型据类型int型指针型指针p,也即在定义指针,也即在定义指针p的同时为其初始化,的同时为其初始化,初值为变量初值为变量a的内存地址,其语句如下。的内存地址,其语句如下。int a,*p=&a;读者可以看出,上述语句同时定义了整型变量读者可以看出,上述语句同时定义了整型变量a和指针变量和指针变量p,并为指针变量,并为指针变量p初始化为初始化为a的地址。的地址。 1-6指针的访问指针的访问 C+中,为了取得一个变量的地址,引入了取地址运算中,为了取得一个变量的地址,引入了取地址运算符符&,使用取地址运算符,使用取地址运算符“&”来取得一个
6、变量的地址,来取得一个变量的地址,其语法如下所示:其语法如下所示:&变量名变量名;例如,表达式例如,表达式“&x”表示变量表示变量x的地址,的地址,“&y”表示变表示变量量y的地址,但这个变量必须是已经存在的变量。此外,的地址,但这个变量必须是已经存在的变量。此外,取地址运算符取地址运算符“&”只能应用于内存中存在的数据,如只能应用于内存中存在的数据,如变量、数组元素等等,而不能用于表达式、常数或者是变量、数组元素等等,而不能用于表达式、常数或者是寄存器变量。寄存器变量。在在C+中,中,*运算符为取值运算符,也称为指针运算符,运算符为取值运算符,也称为指针运算符,或指向运算符,也称间接运算符,
7、或指向运算符,也称间接运算符,*p代表代表p所指向的变所指向的变量。量。 1-7指针的算术运算指针的算术运算 指针变量也有加减运算,指针可以加减某个整型数,指指针变量也有加减运算,指针可以加减某个整型数,指针与指针可以相减。但指针与指针相加是没有意义的,针与指针可以相减。但指针与指针相加是没有意义的,指针的乘除也没有意义。指针的值是一个内存地址,而指针的乘除也没有意义。指针的值是一个内存地址,而一个内存地址可以用一个整型数表示。因此,指针的算一个内存地址可以用一个整型数表示。因此,指针的算术运算可以看作是整型数间的一个运算。术运算可以看作是整型数间的一个运算。 1-8在在C+中,两个指针之间的
8、关系运算表示它们指向的内存地中,两个指针之间的关系运算表示它们指向的内存地址位置之间的关系,例如,下面语句定义指针址位置之间的关系,例如,下面语句定义指针p和和q并分别进并分别进行初始化。行初始化。int a;int *p=&a,*q=p;若上面声明的两个指针作若上面声明的两个指针作p=q运算,其结果为运算,其结果为1(true),),即指针即指针p、q指向同一个变量。读者需要注意,两指针相等的指向同一个变量。读者需要注意,两指针相等的概念是两指针指向同一位置。因此,假设数据在内存中的存概念是两指针指向同一位置。因此,假设数据在内存中的存储逻辑是由前向后,那么指向后方的指针大于指向前方的指储逻
9、辑是由前向后,那么指向后方的指针大于指向前方的指针。针。 指针的关系运算指针的关系运算 1-9用指针指向数组其实就是让指针指向这段连续内存的用指针指向数组其实就是让指针指向这段连续内存的首地址,也就是数组中第一个元素(下标为首地址,也就是数组中第一个元素(下标为0)的地址。)的地址。定义一个指向数组的指针变量同定义普通指针没有什定义一个指向数组的指针变量同定义普通指针没有什么不同,即定义一个跟数组元素类型相同的指针即可。么不同,即定义一个跟数组元素类型相同的指针即可。由于数组是一段连续的内存,指针可以指向数组,而由于数组是一段连续的内存,指针可以指向数组,而且可以通过加减整数来移动指针。所以,
10、可以通过指且可以通过加减整数来移动指针。所以,可以通过指针来访问数组,即数组中的元素。指针指向数组的首针来访问数组,即数组中的元素。指针指向数组的首地址,进而可以移动指针到指定的元素。也可以一次地址,进而可以移动指针到指定的元素。也可以一次只增加只增加1,从而达到遍历整个数组的目的。,从而达到遍历整个数组的目的。 指向数组的指针指向数组的指针 1-10事实上,指向字符串的指针就是一个事实上,指向字符串的指针就是一个char类型的指针。类型的指针。与普通指针一样,字符串指针在使用前也必须先定义。与普通指针一样,字符串指针在使用前也必须先定义。例如,下面语句定义了一个字符串例如,下面语句定义了一个
11、字符串str,并定义了一个,并定义了一个指向该字符串的指针指向该字符串的指针p,并为该指针进行初始化。,并为该指针进行初始化。char str =”Hello World”;/ 定义一个字符串定义一个字符串char * p = str;/ 定义一个字符指针,并初始化为定义一个字符指针,并初始化为字符串的首地址字符串的首地址上述语句中上述语句中str为字符串的首地址,为字符串的首地址,“Hello World”为为该字符串的值。该字符串的值。 指向字符串的指针指向字符串的指针 1-11引用引用 在在C+中,引用也是一种数据类型。不过,引用不能独立存中,引用也是一种数据类型。不过,引用不能独立存在
12、,而只能依附于一个变量。所以定义一个引用,必须要在,而只能依附于一个变量。所以定义一个引用,必须要指明是哪个变量的引用。定义一个引用包括目标变量的数指明是哪个变量的引用。定义一个引用包括目标变量的数据类型、引用修饰符据类型、引用修饰符“&”、引用的标识符以及目标变量、引用的标识符以及目标变量的标识符。其语法如下所示:的标识符。其语法如下所示:类型标识符类型标识符 &引用名引用名 = 目标变量名目标变量名;其中,类型标识符是目标变量的类型;其中,类型标识符是目标变量的类型;“&”是引用修饰符,是引用修饰符,表示定义的是一个引用;而被引用的变量则通过赋值运算表示定义的是一个引用;而被引用的变量则通
13、过赋值运算符指定。符指定。 1-12引用与指针引用与指针 与传统的与传统的C语言相比,引用是语言相比,引用是C+特有的新类型。在很多情特有的新类型。在很多情况下,引用提供了与指针操作同等的能力。主要表现在:况下,引用提供了与指针操作同等的能力。主要表现在:引用和指针都是地址的概念;指针指向一块内存,它的内引用和指针都是地址的概念;指针指向一块内存,它的内容是所指内存的地址;引用是某块内存的别名。容是所指内存的地址;引用是某块内存的别名。C+中指针与引用都是让你间接引用其他对象,但是引用和中指针与引用都是让你间接引用其他对象,但是引用和指针还是有一些区别,在使用时应当根据实际情况进行选指针还是有
14、一些区别,在使用时应当根据实际情况进行选择。择。1-13动态内存分配动态内存分配 C+的程序中的内存分配分为静态分配和动态分配,其中静的程序中的内存分配分为静态分配和动态分配,其中静态分配由编译器来在程序运行之前分配,而动态分配是在态分配由编译器来在程序运行之前分配,而动态分配是在程序运行的过程中分配的。程序运行的过程中分配的。C+中通过关键字中通过关键字new和和delete来实现程序的动态内存分配来实现程序的动态内存分配和回收。其中,关键字和回收。其中,关键字new实现内存分配,如果需要对分实现内存分配,如果需要对分配出的内存进行初始化,则在类型后面加上一个括号,并配出的内存进行初始化,则
15、在类型后面加上一个括号,并带有初始值。因此,带有初始值。因此,C+中动态分配内存的一般形式如下中动态分配内存的一般形式如下所示。所示。类型标识符类型标识符 *指针名指针名 = new 类型标识符类型标识符(初始值初始值);需要读者注意的是,为了保存分配出的内存的地址,应当使需要读者注意的是,为了保存分配出的内存的地址,应当使用一个指针指向用一个指针指向new的结果。因此,上述形式通过类型标的结果。因此,上述形式通过类型标识符定义了一个指针。识符定义了一个指针。 1-14指向指针的指针指向指针的指针 读者知道,虽然指针存储的是一个地址,但指针本身也是一读者知道,虽然指针存储的是一个地址,但指针本
16、身也是一个变量,在内存中占据一定的空间,并且具有一个地址,个变量,在内存中占据一定的空间,并且具有一个地址,这个地址也可以利用指针来保存。因此,同样可以声明一这个地址也可以利用指针来保存。因此,同样可以声明一个指针来指向它,这个指针称为指向指针的指针。个指针来指向它,这个指针称为指向指针的指针。C+中,指向指针的指针也被称为二级指针,在声明指向指中,指向指针的指针也被称为二级指针,在声明指向指针的指针时,其形式与声明指针类似,但需加上两个间接针的指针时,其形式与声明指针类似,但需加上两个间接取值的运算符取值的运算符“*”,如下所示。,如下所示。数据类型数据类型 *指针变量名指针变量名其中,两个
17、其中,两个“*”表示二级指针;数据类型是指通过两次间表示二级指针;数据类型是指通过两次间接寻址后所访问的变量类型。接寻址后所访问的变量类型。1-15小结小结 本章主要介绍了本章主要介绍了C+中指针和引用的相关内容。对于指中指针和引用的相关内容。对于指针,本章着重讲解了指针的概念和指针的访问方式,针,本章着重讲解了指针的概念和指针的访问方式,根据指针在数组中的应用,本章以具体示例介绍指根据指针在数组中的应用,本章以具体示例介绍指向一维数组和多维数组的指针。此外,指针的算术向一维数组和多维数组的指针。此外,指针的算术运算和关系运算也是程序中较为常见的,本章也通运算和关系运算也是程序中较为常见的,本
18、章也通过示例进行了具体讲解。指针在字符串中的操作主过示例进行了具体讲解。指针在字符串中的操作主要体现在字符串指针的指向和移动。同时,本章简要体现在字符串指针的指向和移动。同时,本章简要介绍了引用及其与指针的区别,本章通过指针数要介绍了引用及其与指针的区别,本章通过指针数组、指针与函数、动态内存分配和指向指针的指针组、指针与函数、动态内存分配和指向指针的指针讲解对指针的高级应用做了简要介绍。讲解对指针的高级应用做了简要介绍。 1-16习题习题 【题目题目136】如果有如下语句:如果有如下语句:int *point,a=4;point=&a;则下面均代表地址的一组选项是?则下面均代表地址的一组选项
19、是?Aa,point,*&a B&*a,&a,*pointC*&point,*point,&a D&a,&*point ,point【分析分析】该试题主要考查指针的概念。上述语句中定义了指该试题主要考查指针的概念。上述语句中定义了指针针point并为其初始化为变量并为其初始化为变量a的地址,也即指针的地址,也即指针point指指向变量向变量a。因此,。因此,point和和&a都代表地址,而都代表地址,而a和和*point都都表示具体值。根据该原则,可以排除选项表示具体值。根据该原则,可以排除选项ABC,因此全,因此全部代表地址的是选项部代表地址的是选项D。选项。选项D中的中的&*point相当
20、于相当于&a,也即一个具体的地址。也即一个具体的地址。1-17【题目题目137】写出下列程序的运行结果。写出下列程序的运行结果。#include using namespace std;int main() int *p; int n = 100; p=&n; coutn=nendl; cout*p=*pendl; system(pause); return 0;【分析分析】该试题主要考查指针的概念。上述语句中定义了指该试题主要考查指针的概念。上述语句中定义了指针针p和整型变量和整型变量n,并为指针,并为指针p进行初始化,其值为变量进行初始化,其值为变量n的地址。该试题使用间接取值符号的地址。
21、该试题使用间接取值符号*将指针指向的值输出,将指针指向的值输出,根据运算符根据运算符*的运算规则,此处的输出为的运算规则,此处的输出为100 100。1-18【题目题目138】编写一个编写一个C+程序,接收从键盘输入的程序,接收从键盘输入的10个整个整数,用指针求这数,用指针求这10个数中的最大数、最小数和平均值。个数中的最大数、最小数和平均值。【分析分析】该试题主要考查指针与数组的关系。首先定义一个该试题主要考查指针与数组的关系。首先定义一个包含包含10个元素的数组和一个指针,将指针指向该数组,个元素的数组和一个指针,将指针指向该数组,即将指针初始化为数组的首地址,数组元素的输入和输出即将指
22、针初始化为数组的首地址,数组元素的输入和输出都可以通过指针来实现,通过循环语句实现所有数组元素都可以通过指针来实现,通过循环语句实现所有数组元素的比较。的比较。1-19【题目题目139】若有以下定义,则对若有以下定义,则对a数组元素的正确引用是数组元素的正确引用是_. int a5,*p=a; A*&a5 Ba+2 C*(p+5) D*(a+2)【分析分析】该试题主要考查指向数组的指针的数组元素访问问该试题主要考查指向数组的指针的数组元素访问问题。上述语句定义了包含题。上述语句定义了包含5个元素的整型数组个元素的整型数组a,同时定,同时定义指针义指针p指向该数字。对于如上指向该数字。对于如上4
23、个选项,个选项,AC选项中不存选项中不存在在a5这个元素,这是因为数组的下标越界,而这个元素,这是因为数组的下标越界,而B选项是选项是一个地址,不能引用元素。因此,选项一个地址,不能引用元素。因此,选项D是对数组元素的是对数组元素的正确引用,其表示数组的第正确引用,其表示数组的第3个元素。个元素。1-20【题目题目140】编写一个编写一个C+程序,用指针将一个程序,用指针将一个3*3的二维矩的二维矩阵进行转置操作。所谓数组的转置,即将矩阵的元素根据阵进行转置操作。所谓数组的转置,即将矩阵的元素根据主次对角线进行交换。例如,下面是原矩阵和转置后的矩主次对角线进行交换。例如,下面是原矩阵和转置后的
24、矩阵。阵。1 2 3 1 4 7 4 5 6 2 5 8 7 8 9 3 6 9【分析分析】该试题主要考查指针数组指针的应用。该试题首先该试题主要考查指针数组指针的应用。该试题首先需要定义一个二维矩阵和一个数组指针,该指针指向二维需要定义一个二维矩阵和一个数组指针,该指针指向二维数组的首地址,通过双重循环语句输入该数组的元素,通数组的首地址,通过双重循环语句输入该数组的元素,通过指针实现数组元素的交换并将交换后的结果输出。过指针实现数组元素的交换并将交换后的结果输出。1-21【题目题目141】以下程序的输出结果是以下程序的输出结果是?#include using namespace std;i
25、nt main() char s=ABCD; char *p; for (p=s;ps+4;p+) coutpendl; system(pause); return 0;1-22【题目题目142】若有函数若有函数char *func(char *p)return p;则该函数的返回值是?则该函数的返回值是?A无确切的值无确切的值B形参形参p中存放的地址中存放的地址C一个临时存储单元的地址一个临时存储单元的地址C形参形参p自身的地址自身的地址【分析分析】该试题主要考查函数与指针的关系。上述语句中定该试题主要考查函数与指针的关系。上述语句中定义了一个返回值为字符型指针的函数义了一个返回值为字符型指
26、针的函数func,该函数的形,该函数的形参参p也是一个字符指针。返回值为指针的函数也即指针函也是一个字符指针。返回值为指针的函数也即指针函数,上述语句中返回指针数,上述语句中返回指针p,也即返回值为一个地址,该,也即返回值为一个地址,该地址是形参地址是形参p中所存放的地址。因此,该函数的返回值为中所存放的地址。因此,该函数的返回值为形参形参p中存放的地址,即选项中存放的地址,即选项B。1-23【题目题目143】用变量用变量a给出下面的定义给出下面的定义 a 一个整型数。一个整型数。b 一个指向整型数的指针。一个指向整型数的指针。c 一个指向指针的的指针,它指向的指针是指向一个整型一个指向指针的
27、的指针,它指向的指针是指向一个整型数。数。d 一个有一个有10个整型数的数组。个整型数的数组。e 一个有一个有10个指针的数组,该指针是指向一个整型数的。个指针的数组,该指针是指向一个整型数的。 f 一个指向有一个指向有10个整型数数组的指针。个整型数数组的指针。g 一个指向函数的指针,该函数有一个整型参数并返回一一个指向函数的指针,该函数有一个整型参数并返回一个整型数。个整型数。h 一个有一个有10个指针的数组,该指针指向一个函数,该函数个指针的数组,该指针指向一个函数,该函数有一个整型参数并返回一个整型数。有一个整型参数并返回一个整型数。1-24【题目题目144】编写两个函数,利用函数型指
28、针变量的调用,编写两个函数,利用函数型指针变量的调用,分别求出两数中的大值和小值。分别求出两数中的大值和小值。【题目题目145】编写一个函数,分别求出由指针编写一个函数,分别求出由指针a所指向的字符所指向的字符串中包含的每种十进制数字出现的次数,把统计结果保存串中包含的每种十进制数字出现的次数,把统计结果保存在数组在数组b的相应元素中。的相应元素中。【题目题目146】编写一个函数编写一个函数find,其功能是:在指针,其功能是:在指针p所指数所指数组中,查找值为组中,查找值为x的元素,找到后,返回该元素的下标,的元素,找到后,返回该元素的下标,否则返回否则返回-1。1-25【题目题目147】编
29、写程序,读入一个以符号编写程序,读入一个以符号“.”结束的长度小结束的长度小于于20字节的英文句子,检查其是否为回文(即正读和反字节的英文句子,检查其是否为回文(即正读和反读都是一样的,不考虑空格和标点符号)。例如:读都是一样的,不考虑空格和标点符号)。例如: 读入句子:读入句子:MADAM IM ADAM. 它是回文,所以输出:它是回文,所以输出:YES读入句子:读入句子:ABCDBA). 它不是回文,所以输出:它不是回文,所以输出:NO【题目题目148】编写程序,其中包括一个函数,此函数的功能编写程序,其中包括一个函数,此函数的功能是:对一个长度为是:对一个长度为N 的字符串从其第的字符串
30、从其第K个字符起,删去个字符起,删去M个字符,组成长度为个字符,组成长度为N-M的新字符串的新字符串(其中其中N、M=80,K=N)。例如输入字符串。例如输入字符串We are poor students.,利用此函数进行删除,利用此函数进行删除poor的处理,输出的处理,输出处理后的字符串是处理后的字符串是We are students.。1-26【题目题目149】编写从多个字符串中寻找最长串的函数。编写从多个字符串中寻找最长串的函数。【题目题目150】编写一个函数编写一个函数insert(s1,s2,ch),实现在字符串,实现在字符串s1中的指定字符中的指定字符ch位置处插入字符串位置处插
31、入字符串s2。【题目题目151】使用引用参数编制程序,实现两个字符串变量使用引用参数编制程序,实现两个字符串变量的交换。例如开始时的交换。例如开始时char *p=”hello”;char *q=”how are you”;交换后使交换后使p和和q指向的内容别是:指向的内容别是:p:”how are you”q:”hello”1-27【题目题目152】使用指针编写函数使用指针编写函数strcat(),实现两个字符串的,实现两个字符串的首尾连接(将字符串首尾连接(将字符串s2接到接到s1的后面,的后面,s1最后面的最后面的0被取消)。被取消)。【题目题目153】编写一个函数编写一个函数sort,实现对字符串按字典顺序,实现对字符串按字典顺序由小到大排序。由小到大排序。【题目题目154】编写一个函数编写一个函数swap,其参数均为指针类型,实,其参数均为指针类型,实现数据交换功能功能。现数据交换功能功能。