C++程序设计第7章指针.ppt
《C++程序设计第7章指针.ppt》由会员分享,可在线阅读,更多相关《C++程序设计第7章指针.ppt(98页珍藏版)》请在三一办公上搜索。
1、第7章 指针,目的与要求7.1 指针与指针变量7.2 指针与数组7.3 指针变量与数组作为函数参数(习题课)7.4 指针数组和指向一维数组的指针变量7.5 返回指针值的函数与函数指针变量7.6 new和delete运算符7.7 引用类型变量和const类型的指针本章小结,目的与要求,通过本章的学习,要求了解指针、指针变量、指针数组、指向一维数组的指针、返回指针值的函数、函数指针、引用类型变量的概念,掌握指针变量的定义格式及使用方法,重点掌握用指针变量处理有关变量、一维数组与字符串数组的问题。掌握用指针变量与数组作为函数参数时函数的使用方法。了解二维数组中有关行首地址、行地址与元素地址的概念,了
2、解二维数组中元素的各种表示方式。初步学会指针数组、指向一维数组的指针、返回指针值的函数与函数指针的定义格式与简单使用方法。学会用new与delete运算符动态分配与回收内存空间的方法。掌握引用类型变量的定义与使用方法。,7.1 指针与指针变量,7.1.1 指针的概念(1)指针:系统为变量、数组、函数等分配内存的首地址称为指针。(2)指针变量:用于存放指针(内存首地址)的变量称为指针变量。,指针变量的定义与引用,1.指针变量的定义存储类型*,*,*;2.指针变量的赋值(1)取地址运算符&:取出变量的内存首地址(2)指针变量的赋值:指针变量=&变量;或指针变量=指针变量;,3.指针变量的引用,指针
3、运算符*:通过指针变量间接访问变量对应存储单元内容。【例7.1】定义指针变量p、p1、q,并将变量a的地址赋给p、p1,输出a、p、p1、*p、*p1的值。例程 4.指针变量初始化 例如:int*p=,指针变量的运算,1.指针变量赋值运算【例7.2】定义三个整型变量a1、a2、a3,用指针变量完成a3=a1+a2的操作。再定义两个实型变量b1、b2,用指针变量完成b1+b2的操作。例程 2.指针变量的算术运算(1)自加运算 格式:+;作用:将指针变量指向下一个元素,即:=+sizeof(),指针变量的算术运算,(2)自减运算 格式:;作用:指针变量指向上一元素,即:=sizeof()自加运算和
4、自减运算既可后置,也可前置。(3)指针变量加n运算 格式:=+n;作用:将指针变量指向下n个元素的运算,即:=+sizeof()*n,指针变量的算术运算,(4)指针变量减n运算 格式:=n;作用:将指针变量指向上n个元素的运算,即:=sizeof()*n【例7.3】指针变量的自加、自减、加n和减n运算。例程,3.指针变量的关系运算,指针变量的关系运算是指针变量值的大小比较,即对两个指针变量内的地址进行比较,主要用于对数组元素的判断。【例7.4】用指针变量求一维实型数组元素和,并输出数组每个元素的值及数组和。例程,4.指针运算符的混合运算与优先级,(1)指针运算符*与取地址运算符&的优先级相同,
5、按自右向左的方向结合。(2)“+”、“”、“*”、“&”的优先级相同,按自右向左方向结合。【例7.5】指针运算符“*”、“&”、“+”优先级与结合性示例。例程,7.2 指针与数组,一维数组与指针 1.数组指针 数组的首地址称为 数组指针。数组a的首地址用数组名a表示,即:数组指针=&a0=a。,2.数组指针变量,存放数组元素地址的变量称为数组指针变量。例如:int a5;int*p=则p为数组指针变量。【例7.6】用指针变量访问数组元素。例程 由此例可以看出,访问数组元素值有三种方法:(1)移动指针变量(p+),依次访问数组元素(*p)。(2)指针变量不变,用p+i或 a+i 访问数组第i个元
6、素。(3)以指针变量名p作为数组名用pi访问数组元素ai。,3.数组元素的引用,对一维数组a 而言,当p=a时:第i个元素地址:&ai=p+i=a+i。第i个元素值:ai=*(p+i)=*(a+i)=pi。一维数组的第i个元素有四种方式引用:ai、*(p+i)、*(a+i)、pi。用数组指针的四种方法求一维数组中的最大值的方法为:方法一:使用*(a+i)访问ai方法一:用指针变量名p代替数组名a,即用 pi代替ai方法二:移动指针变量p+,用*p访问ai方法三:使用*(p+i)访问第 i个元素ai,7.2.2 二维数组与指针,1二维数组元素在内存中的存放方式(1)二维数组元素在内存按行顺序存放
7、(2)可用指针变量来访问二维数组元素。例如:int a33;【例7.7】用指针变量输出二维数组各元素的值。例程,2.二维数组行首地址,在二维数组a中:(1)第i行首地址(即第i行第0列元素地址):用ai表示,ai=&ai0(2)元素aij的地址:用ai+j来表示,而元素aij的值为:*(ai+j)。【例7.8】定义一个3行3列数组,输出每行的首地址及所有元素值。例程,3.二维数组行地址,(1)第i行的行地址:用a+i或&ai表示。(2)行地址与行首地址区别 行地址的值与行首地址的值是相同的,即:a+i=&ai=ai=&ai0 两者类型不同,行地址a+i与&ai只能用于指向一维数组的指针变量,而
8、不能用于普通指针变量。数组名a表示第0行的行地址,即:a=a+0=&a0。,4.二维数组的元素地址与元素值,(1)第i行首地址:ai、*(a+i)、&ai0。(2)元素aij的地址:ai+j、*(a+i)+j、&ai0+j、&aij(3)元素aij值:*(ai+j)、*(*(a+i)+j)、*(&ai0+j)、aij【例7.9】定义二维数组a33,用二种方式输出行地址,用三种方式输出行首地址,用四种方式输出所有元素地址及元素值。,例程,二维数组a的行地址、行首地址、元素地址、元素值的各种表示方式,7.2.3 字符串与指针,1.字符串与字符串指针(1)字符串指针:是字符串的首地址;(2)字符串指
9、针变量:存放字符串元素地址的变量;(3)字符串指针变量定义格式:char*=“字符串”;(4)字符串指针变量的引用【例7.10】用字符串指针变量实现字符串拷贝。例程,2.字符型指针变量与字符数组的区别,(1)分配内存(2)初始化赋值含义(3)赋值方式(4)输入/输出方式(5)值的改变,字符数组与字符型指针变量的区别小结,7.3 指针变量与数组作为函数参数(习题课),7.3.1 指针变量作为函数参数 1.函数定义格式(*,)函数体 2.函数调用格式 函数名(&变量,)或 函数名(指针变量,)3实参与形参的传送方式 传地址,指针变量作为函数参数时实参与形参的传送方式,用指针变量作为函数参数时,传送
10、给函数的是变量地址或指针地址,所以为传地址方式。由于传送的是变量地址,所以可直接对函数内指针变量所指数据进行修改,并返回修改后的值。即:传地址可对实参单元进行修改,并返回修改值。当函数需要返回多个参数值时,可使用指针变量作为参数来实现。而传值方式的函数调用,只能返回一个函数值,其形参值是无法返回的。,指针变量作为函数参数举例,【例7.11】编写两个数据交换函数,用指针变量作为函数参数实现两个数据的交换,交换 过程如图所示。例程,指针变量作为函数参数举例,【例7.12】用指针变量作为函数参数,编写字符串复制函数str_cpy(char*p1,char*p2)。在主函数中定义二个字符数组str18
11、0、str280,用getline()函数将字符串输入str2中,然后调用str_cpy()函数将str2复制到str1中,最后输出str1。,例程,7.3.2 数组与指针作为函数参数,由于数组名为数组的起始地址,当把数组名作为函数参数时,其作用与指针相同,均为传地址。数组与指针作为函数参数有四种情况:(1)函数的实参为数组名,形参为数组。(2)函数的实参为数组名,形参为指针变量。(3)函数的实参为指针变量,形参为数组。(4)函数的实参为指针变量,形参为指针变量。【例7.13】用指针与数组作为函数参数,用四种方法求整型数组的最大值。例程【例7.14】用指针与数组作为函数参数,用四种方法实现一维
12、整型数组的排序。例程,指针变量、数组指针变量、字符型指针变量小结,指针变量、数组指针变量、字符型指针变量都属于同一类型的指针变量,它们的定义格式为:*=,7.4 指针数组和指向一维数组的指针变量,7.3.1 指针数组(1)指针数组:由若干个同类型指针变量所组成的数组称为指针数组,指针数组中每一个元素都是一个指针变量。(2)指针数组定义格式为:存储类型*;其中:*表示定义了一个指针数组,类型指明指针数组中每个元素所指向的数据类型。,指针数组,例如,指针数组的定义:int*pi4;表示定义了由4个整型指针元素pi0、pi1、pi2、pi3组成的整型指针数组。char*pc4;表示定义了由4个字符型
13、指针元素pc0、pc1、pc2、pc3组成的字符型指针数组。(3)指针数组元素的引用【例7.15】用指针数组输出字符串数组中各元素的值。例程 注意:除了用初始化方法给字符串数组c赋值外,也可用cin语句输入字符串到ci中。,指针数组举例,【例7.16】将若干个字符串按升序排序后输出。例程,7.4.2 指向一维数组的指针变量,1.作用:用于表示二维数组某行各元素值。2.定义格式:(*);例如:int a33=1,2,3,4,5,6,7,8,9;int(*p)3;/数组长度3必须与二维数组a33的列数3相同 p=,指向一维数组的指针变量,3.引用 定义了指向一维数组的指针变量p后,只要将二维数组a
14、第i行的行地址a+i或 则可用(*p)0、(*p)1、(*p)n-1来表示数组a第i行的元素ai0、ai1、ain-1。【例7.17】用指向一维数组的指针变量,输入/输出二维数组中各元素值,求二维数组元素和,并输出元素和。例程,指向一维数组的指针变量,说明:(1)p所指一维数组的长度应与数组a的列数相同;(2)只能将行地址a+i 或&ai赋给指向一维数组的指针变量p,而不能将行首地址ai或*(a+i)赋给p;行首地址ai或*(a+i)只能赋给指向数组元素的指针变量。(3)指向一维数组的指针变量p加1后,p指向数组的下一行【例7.18】用指向一维数组的指针变量为函数的形参,求二维实型数组元素和。
15、,例程,7.5 返回指针值的函数与函数指针变量,7.5.1 返回指针值的函数 在前面介绍的自定义函数中,函数的返回类型可以是整型、实型、字符型等等,如求两个整数最大值函数int max(int x,int y)的返回类型为整型。事实上,C+还允许自定义函数的返回类型为指针类型,如int*max(int x,int y)。若函数返回值为指针类型,则称该函数为返回指针值的函数。,返回指针值的函数的定义与调用,1.函数定义格式 定义返回指针值的函数格式为:*()其中:“*”说明函数返回一个指针,即返回一个地址。2函数调用格式 返回指针值的函数一般调用格式为:指针变量=(实参);或:(实参),返回指针
16、值的函数举例,【例7.19】用返回指针值的函数求两个整数的最大值。【例7.20】编写返回指针值的字符串连接函数str_cat(),该函数能将字符串2连接到字符串1的尾部,并返回字符串1的地址。在主函数中定义两个字符数组,输入两个字符串到字符数组,调用字符串连接函数str_cat(),并将字符串1的返回地址赋给指针变量p,最后用p输出连接后的字符串。例程【例7.21】设计简单的加密程序,将字符串存入字符数组s,然后将s中的每一个字符按下述加密函数进行加密处理。si16 当 48si57,si中的字符为数字09;si=si23 当 65si90,si中的字符为大写字母AZ;si5 当97si122
17、,si中的字符为小写字母az;其中si为字符串中第i个字符的ASCII码。输入的字符串只能由字符或数字组成。,例程,例程,函数指针变量,要讨论函数指针变量首先应了解函数指针的概念,然后才能讨论函数指针变量的概念。1函数指针 所谓函数指针就是函数的入口地址。与用数组名表示数组首地址类似,在C+中,用函数名来表示函数的入口地址。2函数指针变量 函数指针变量是用于存放函数指针的变量,也即存放函数入口地址的变量。要使用函数指针变量,必须先定义后使用。,函数指针变量的定义和赋值,3.函数指针变量的定义格式(*)();例如:float(*pf)(flaot x);表示定义了一个名为pf的函数指针变量。4.
18、函数指针变量的赋值 由于函数指针变量用于存放函数的入口地址,而函数入口地址是用函数名来表示的,因此,在使用函数指针变量前,必须将函数名(即函数入口地址)赋给函数指针变量。例如:float(*pf)(float);/定义名为pf函数指针变量 float f(float x)/定义名为f的实型函数 return 1+x;pf=f;/将函数f()的入口地址赋给函数指针变量pf注意:只能将与函数指针变量具有同类型、同参数的函数名赋给函数指针变量。,函数指针变量的作用和调用,5.函数指针变量的作用 一旦函数入口地址f赋给函数指针变量pf后,就可以使用函数指针变量pf来表示函数f。因此,函数指针变量的作用
19、是用函数指针变量来代替多个函数,完成某项运算操作,如对不同函数的定积分值计算。6.函数指针变量的调用格式 对函数指针变量进行赋值后,可用该指针变量调用函数。调用函数的格式:(*)();或:();如:float y;y=(*pf)(1);或 y=pf(1);,函数指针变量举例,【例7.22】当变量x=1时,用函数指针变量计算下列三个函数的值。f1(x)=1+x;f2(x)=;f3(x)=;,例程,函数指针变量举例,【例7.23】设计一个程序,用梯形法求下列定积分的值。例程,函数指针变量举例,分析:由高等数学可知,的定积分值等于由曲线y=f(x)、直线x=a、x=b、y=0所围曲边梯形的面积s,如
20、图所示。现将曲边梯形划分成n个小曲边梯形s0、s1、s2、sn-1。每个曲边梯形的高均为h=(ba)/n,用梯形近似曲边梯形后各曲边梯形的面积近似为:s0=(y0+y1)*h/2s1=(y1+y2)*h/2s2=(y2+y3)*h/2 sn-1=(yn-1+yn)*h/2s=s0+s1+s2+sn-1=(y0+(y1+y2+yn-1)*2+yn)*h/2=(f(x0)+f(xn)/2+(f(x1)+f(x2)+f(xn-1)*hx0=a,xn=b,xi=a+i*h用梯形法求定积分面积的公式为:其中:a、b分别为积分的下、上限,n为积分区间的分隔数,h=(ba)/n,h为积分步长;f(x)为被积
21、函数。,7.6 new和delete运算符,7.6.1 new 运算符1.new运算符的作用 new运算符用于动态分配内存空间,并将分配内存的地址赋给指针变量。2.new运算符的定义格式(1)=new;作用:动态分配由类型确定大小的连续内存空间,并将内存首地址赋给指针变量。(2)=new(value);作用:除完成(1)的功能外,还将value作为所分配内存空间的初始值。(3)=new;作用:分配指定类型的数组空间,并将数组的首地址赋给指针变量。,7.6.2 delete 运算符,(1)delete;作用:将指针变量所指的内存空间归还系统。(2)delete;或:delete;作用:将指针变量
22、所指一维数组内存空间归还给系统。【例7.24】用new运算符动态生成由n个元素组成的一维数组,输入n个值给一维数组,求出并输出一维数组元素和,最后用delete运算符动态回收一维数组所占用的内存空间。例程,7.6.3 使用new 和 delete 运算符应注意的事项,(1)用new 为数组分配内存时,不能进行初始化赋值。例如:int*p=new int10(0,1,2,3,4,5,6,7,8,9);/是错误的。(2)用new 分配内存后,若指针变量值为0,则表示分配失败。此时应终止程序执行。(3)用new 分配内存空间的指针值必须保存起来,以便用delete 归还内存。否则会出现不可预测的后果
23、。例如:float*p=new float(24.5),x;p=由于改变了指针p的值,所以系统已无法归还动态分配的存储空间。执行delete p时会出错。,7.7 引用类型变量和const类型的指针,7.7.1 引用类型变量的定义及使用 引用类型变量:是已定义变量的别名,变量与其引用变量共用同一内存空间。1.引用类型变量的定义引用类型变量的定义格式:/输出结果为100,引用类型变量的说明,对引用类型变量须说明如下:(1)定义引用类型变量时必须初始化,初始化变量必须与引用类型变量类型相同。例如:float x;int,2.引用类型变量作为函数参数,引用变量作为函数参数是一种传地址的数据传送方式。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- C+ 程序设计 指针
链接地址:https://www.31ppt.com/p-6153989.html