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