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)指针变量:用于存放指针(内存首地址)的变量称为指针变量。7.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指针变量7.1.3 指针变量的运算 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】用指针变量求一维实型数组元素和,并输出数组每个元素的
5、值及数组和。例程4.指针运算符的混合运算与优先级(1)指针运算符*与取地址运算符&的优先级相同,按自右向左的方向结合。(2)“+”、“”、“*”、“&”的优先级相同,按自右向左方向结合。【例7.5】指针运算符“*”、“&”、“+”优先级与结合性示例。例程 7.2 指针与数组7.2.1 一维数组与指针 1.数组指针 数组的首地址称为 数组指针。数组a的首地址用数组名a表示,即:数组指针=&a0=a。2.数组指针变量 存放数组元素地址的变量称为数组指针变量。例如:int a5;int*p=&a0;则p为数组指针变量。【例7.6】用指针变量访问数组元素。例程 由此例可以看出,访问数组元素值有三种方法
6、:(1)移动指针变量(p+),依次访问数组元素(*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)访问第
7、i个元素ai7.2.2 二维数组与指针 1二维数组元素在内存中的存放方式(1)二维数组元素在内存按行顺序存放(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)行地址与行首地址区别 行地址的值与行首地址的值是相同的,
8、即:a+i=&ai=ai=&ai0 两者类型不同,行地址a+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的行地址、行首地址、元素地址、元素值的各种表示方
9、式 7.2.3 字符串与指针 1.字符串与字符串指针(1)字符串指针:是字符串的首地址;(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)数据交换前 p
11、10.520.5q*p=x*q=y temp指针变量作为函数参数举例 【例7.12】用指针变量作为函数参数,编写字符串复制函数str_cpy(char*p1,char*p2)。在主函数中定义二个字符数组str180、str280,用getline()函数将字符串输入str2中,然后调用str_cpy()函数将str2复制到str1中,最后输出str1。例程例程7.3.2 数组与指针作为函数参数 由于数组名为数组的起始地址,当把数组名作为函数参数时,其作用与指针相同,均为传地址。数组与指针作为函数参数有四种情况:(1)函数的实参为数组名,形参为数组。(2)函数的实参为数组名,形参为指针变量。(3
12、)函数的实参为指针变量,形参为数组。(4)函数的实参为指针变量,形参为指针变量。【例7.13】用指针与数组作为函数参数,用四种方法求整型数组的最大值。例程 【例7.14】用指针与数组作为函数参数,用四种方法实现一维整型数组的排序。例程指针变量、数组指针变量、字符型指针变量小结 指针变量、数组指针变量、字符型指针变量都属于同一类型的指针变量,它们的定义格式为:*=&变量;只有赋给指针变量地址时才能确定是属于哪一类指针变量。例如:变量的指针变量:int x=10,*p1=&x;数组的指针变量:int a5=1,2,3,4,5,*p2=a;字符串指针变量:char s5=”ABCD”,*p3=s;7
13、.4 指针数组和指向一维数组的指针变量 7.3.1 指针数组(1)指针数组:由若干个同类型指针变量所组成的数组称为指针数组,指针数组中每一个元素都是一个指针变量。(2)指针数组定义格式为:存储类型*;其中:*表示定义了一个指针数组,类型指明指针数组中每个元素所指向的数据类型。指针数组例如,指针数组的定义:int *pi4;表示定义了由4个整型指针元素pi0、pi1、pi2、pi3组成的整型指针数组。char *pc4;表示定义了由4个字符型指针元素pc0、pc1、pc2、pc3组成的字符型指针数组。(3)指针数组元素的引用【例7.15】用指针数组输出字符串数组中各元素的值。例程 注意:除了用初
14、始化方法给字符串数组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=&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-
15、1。【例7.17】用指向一维数组的指针变量,输入/输出二维数组中各元素值,求二维数组元素和,并输出元素和。例程指向一维数组的指针变量说明:(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 返回指针值的函数 在前面介绍的自定义函数中,函数的返回类型可以是整
16、型、实型、字符型等等,如求两个整数最大值函数int max(int x,int y)的返回类型为整型。事实上,C+还允许自定义函数的返回类型为指针类型,如int*max(int x,int y)。若函数返回值为指针类型,则称该函数为返回指针值的函数。返回指针值的函数的定义与调用1.函数定义格式 定义返回指针值的函数格式为:*()其中:“*”说明函数返回一个指针,即返回一个地址。2函数调用格式 返回指针值的函数一般调用格式为:指针变量=(实参);或:(实参)返回指针值的函数举例 【例7.19】用返回指针值的函数求两个整数的最大值。【例7.20】编写返回指针值的字符串连接函数str_cat(),该
17、函数能将字符串2连接到字符串1的尾部,并返回字符串1的地址。在主函数中定义两个字符数组,输入两个字符串到字符数组,调用字符串连接函数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码。输入的字符串只能由字符或数字组成。例程例程7.5.2 函
18、数指针变量函数指针变量 要讨论函数指针变量首先应了解函数指针的概念,然后才能讨论函数指针变量的概念。1函数指针 所谓函数指针就是函数的入口地址。与用数组名表示数组首地址类似,在C+中,用函数名来表示函数的入口地址。2函数指针变量 函数指针变量是用于存放函数指针的变量,也即存放函数入口地址的变量。要使用函数指针变量,必须先定义后使用。函数指针变量的定义和赋值函数指针变量的定义和赋值3.函数指针变量的定义格式 (*)();例如:float(*pf)(flaot x);表示定义了一个名为pf的函数指针变量。4.函数指针变量的赋值 由于函数指针变量用于存放函数的入口地址,而函数入口地址是用函数名来表示
19、的,因此,在使用函数指针变量前,必须将函数名(即函数入口地址)赋给函数指针变量。例如:float(*pf)(float);/定义名为pf函数指针变量 float f(float x)/定义名为f的实型函数 return 1+x;pf=f;/将函数f()的入口地址赋给函数指针变量pf注意:只能将与函数指针变量具有同类型、同参数的函数名赋给函数指针变量。函数指针变量的作用和调用函数指针变量的作用和调用 5.函数指针变量的作用 一旦函数入口地址f赋给函数指针变量pf后,就可以使用函数指针变量pf来表示函数f。因此,函数指针变量的作用是用函数指针变量来代替多个函数,完成某项运算操作,如对不同函数的定积
20、分值计算。6.函数指针变量的调用格式 对函数指针变量进行赋值后,可用该指针变量调用函数。调用函数的格式:(*)();或 :();如:float y;y=(*pf)(1);或 y=pf(1);函数指针变量举例函数指针变量举例【例7.22】当变量x=1时,用函数指针变量计算下列三个函数的值。f1(x)=1+x;f2(x)=;f3(x)=;21xx22cos1xxxx例程函数指针变量举例函数指针变量举例【例7.23】设计一个程序,用梯形法求下列定积分的值。例程dxxs)1(141dxxxs102)1(2dxxxxxs3122)cos(13函数指针变量举例函数指针变量举例分析:由高等数学可知,的定积分
21、值等于由曲线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)*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分别为积分的下
22、、上限,n为积分区间的分隔数,h=(ba)/n,h为积分步长;f(x)为被积函数。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;作用:将指针变量所指的内
23、存空间归还系统。(2)delete ;或:delete ;作用:将指针变量所指一维数组内存空间归还给系统。【例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 分配内存空间的指针
24、值必须保存起来,以便用delete 归还内存。否则会出现不可预测的后果。例如:float*p=new float(24.5),x;p=&x;delete p;由于改变了指针p的值,所以系统已无法归还动态分配的存储空间。执行delete p时会出错。7.7 引用类型变量和const类型的指针 7.7.1 引用类型变量的定义及使用 引用类型变量:是已定义变量的别名,变量与其引用变量共用同一内存空间。1.引用类型变量的定义引用类型变量的定义格式:&=;例如:int a=0;int&ra=a;ra=100;couta;/输出结果为100引用类型变量的说明对引用类型变量须说明如下:(1)定义引用类型变量
25、时必须初始化,初始化变量必须与引用类型变量类型相同。例如:float x;int&px=x;/错误(2)引用类型变量初始化值不能是常数。例如:int&rf=5;/错误(3)可用动态分配内存空间来初始化一个引用变量。例如:float&rx=*new float;rx=200;coutrx;delete℞2.引用类型变量作为函数参数 引用变量作为函数参数是一种传地址的数据传送方式。当形参为引用变量时,由于形参为实参的别名,所以实参与形参占用同一内存单元,对形参的操作就是对实参的操作。因此,使用引用类型变量可返回参数运算结果。【例7.25】用引用变量作为形参,编写使两个数据交换的函数,在主函数
26、中调用该函数实现两个变量中数据互换。例程7.7.2 const 类型变量 1.定义const型常量 定义格式:const =;2定义const 型指针有三种方法来定义const 型指针:定义格式 指针变量值 所指数据值(1)const *;作用:定义指针变量所指数据为常量 可改变 不能改变(2)*const ;作用:定义指针变量值为常量 不能改变 能改变(3)const *const ;作用:定义指针变量值为常量 不能改变 不能改变本章小结 指针:是变量、数组、字符串、函数等在内存的地址。指针变量:是存放指针的变量。指针变量按定义格式大致可分为五种:指针变量、指针数组、指向一维数组的指针变量、
27、返回指针值的函数、函数指针变量。1.指针变量 指针变量用于存放变量或数组的内存地址,必须先定义后使用。(1)指针变量定义格式为:存储类型 *;例如:int b,a10,*p;(2)指针变量赋变量地址或数组地址:例如:p=&b;或p=a;(3)指针变量的引用:例如:*p 指针变量(4)一维数组与指针:对于一维数组a,当*p=a,则:元素地址:a+i、p+i 元素值:ai、*(p+i)、*(a+i)、pi(5)二维数组与指针:对于二维数组amn:行首地址:*(a+i)、ai、&ai0,用于指向数组元素的指针变量。行地址:a+i、&ai,用于指向一维数组的指针变量。元素aij地址:ai+j、*(a+
28、i)+j、&ai0+j、&aij。元素值:*(ai+j)、*(*(a+i)+j)、*(&ai0+j)、aij。(6)字符串与指针:在C+中字符串是存放在字符型数组中的,因此,只要将字符数组地址赋给指针变量pc,则pc就是字符串指针变量。可用字符串指针变量处理字符串。数组与指针作为函数参数数组与指针作为函数参数有4种情况:(1)函数的实参为数组名,形参为数组。(2)函数的实参为数组名,形参为指针变量。(3)函数的实参为指针变量,形参为数组。(4)函数的实参为指针变量,形参为指针变量。2.指针数组 由若干指针元素组成的数组称为指针数组,其定义格式如下:存储类型 *;例如:char c3 4=ABC
29、,DEF,GHI;char*pc3=c0,c1,c2;3.指向一维数组的指针变量 指向一维数组的指针变量可用于处理二维数组的运算问题,其定义格式为:(*);例如:int(*p)3;定义了一个指向一维数组的指针变量p,一维数组是由元素(*p)0、(*p)1、(*p)2组成。4.返回指针值的函数 函数可返回一个指针值,该指针指向一个已定义好的任一类型的数据。定义返回指针值的函数格式为:*()例如:float*f(float x)定义了一个返回实型指针的函数f(),该函数的形参为实型的x。5.函数指针变量 函数指针变量是用于存放函数指针的变量,也即存放函数入口地址的变量。函数指针变量的定义格式为:(
30、*)();在实际使用时,必须将真实的函数入口地址赋给函数指针变量。此时对函数指针变量的调用就变成了对真实函数的调用。6.new 和 delete 运算符 用new 运算符可以动态地分配内存空间,并将分配内存的地址赋给指针变量,语句格式有:=new ;=new(value);=new;delete 运算符用来将动态分配的内存空间归还给系统,语句格式有:delete;delete ;delete ;7.引用类型变量和const类型的指针(1)引用类型变量 引用类型变量主要用于函数之间传送数据,其定义格式为:&=;例如:int&refa=a;引用类型变量refa是已定义变量a的别名,引用类型变量re
31、fa与其相关的变量a使用相同的内存空间。由于引用类型变量与相关变量使用相同的内存空间,所以用引用类型变量作为函数形参时,形参与实参变量使用相同的内存,在函数内对形参的运算就是对实参的运算,因此可通过参数返回函数运算结果。引用类型变量和const类型的指针(2)const类型常量 const =;如:const int PI=3.1415;(3)const类型指针 p *pconst int *p;可变 固定 int *const p;固定 可变const int *const p;固定 固定例7.1#include void main(void)int a=100;int*p,*p1,*q;p
32、=&a;p1=p;q=0;couta=at*p=*ptp=pendl;*p1=200;couta=at*p=*ptp=pendl;coutt*p1=*p1tp1=p1endl;返回返回例7.2#include void main(void)int a1=1,a2=2,a3;int *p1,*p2,*p3;float b1=12.5,b2=25.5;float *fp1,*fp2;p1=&a1;p2=&a2;p3=&a3;*p3=*p1+*p2;fp1=&b1;fp2=&b2;cout*p1=*p1t*p2=*p2t*p1+*p2=*p3n;couta1=a1t a2=a2t a1+a2=a3n
33、;coutb1=*fp1t b2=*fp2tb1+b2=*fp1+*fp2n;例7.2p1*p1=a112p2*p2=a23p3*p3=a3+=fp1*fp1=b112.525.5fp2*fp2=b2+(a)*p3=*p1+*p2 示意图(b)*f p1+*fp2 示意图指针的赋值与算术运算返回返回例7.3#include void main(void)int a5=0,1,2,3,4;int *p;p=&a0;p+;cout*pt;p=p+3;cout*pt;p;cout*pt;p=p3;cout*pt;返回返回例7.4#include void main(void)int a5=1,2,3
34、,4,5,sum=0;int*p,*p1;p1=a+4;for(p=a;pp1;p+)sum+=*p;cout*pt;cout n sum=sumendl;返回返回例7.5#include main()int a4=100,200,300,400,b;int*p=&a0;couttp=pendl;b=*p+;coutb=btp=pendl;b=*+p;coutb=btp=pendl;b=(*p)+;coutb=btp=pendl;b=*(p+);coutb=btp=pendl;b=+*p;coutb=btp=pendl;返回返回例7.6#include#define N 5void main(
35、void)int a5=0,1,2,3,4,i,j,*p;for(p=a;pa+N;p+)cout*pt;coutendl;p=a;for(i=0;iN;i+)cout*(p+i)t;coutendl;for(i=0;iN;i+)cout*(a+i)t;coutendl;for(i=0;iN;i+)cout pi t;coutendl;返回返回例7.7#include void main(void)int a33=1,2,3,4,5,6,7,8,9;int*p=&a00;for(int i=0;i9;i+)cout*pt;p+;返回返回例7.8#include void main(void)i
36、nt a33=1,2,3,4,5,6,7,8,9;for(int i=0;i3;i+)couta i=ai =&ai0endl;for(int j=0;j3;j+)couta ij=*(ai+j)=aijendl;返回返回例7.9#include void main(void)int a33=1,2,3,4,5,6,7,8,9;for(int i=0;i3;i+)cout&ai=&ai=a+iendl;/输出第输出第i行行地址行行地址 coutai=ai=*(a+i)=&ai0endl;/行首地址行首地址 for(int j=0;j3;j+)cout&aij=ai+j=*(a+i)+j=&ai
37、0+j=&aijendl;/输出元素输出元素aij的地址的地址coutaij=*(ai+j)=*(*(a+i)+j)=*(&ai0+j)=aijendl;/输出元素输出元素aij的值的值 返回返回例7.10#include#include void main(void)char*p1=I am a student;char s130,s230;strcpy(s1,p1);char*p2=s2;while(*p!=0)*p2=*p1;p1+;p2+);*p2=0;couts1=s1endl;couts2=s2endl;返回返回例7.11#include void swap(float*p,fla
38、ot*q)float temp;temp=*p;*p=*q;*q=temp;void main(void)float x=10.5,y=20.5;coutx=xty=yendl;swap(&x,&y);coutx=xty=yendl;返回返回例7.12#include void str_cpy(char*p1,char*p2)/用指针变量为形参 while(*p1+=*p2+);void main(void)char str180,str280;char*q1=str1,*q2=str2;coutString2:;cin.getline(str2,80);str_cpy(q1,q2);/用指针
39、变量为实参 coutString1:str1endl;返回返回例7.13(1)#include int max1(int a,int n)/形参为数组名 int i,max=a0;for(i=1;imax)max=ai;return max;int max2(int*p,int n)/形参为指针 int i,max=*(p+0);for(i=1;imax)max=*(p+i);return max;例7.13(2)int max3(int a,int n)/形参为数组名 int i,max=*(a+0);for(i=1;imax)max=*(a+i);return max;int max4(i
40、nt*p,int n)/形参为指针 int i,max=p0;for(i=1;imax)max=pi;return max;例7.13(3)void main(void)int b=1,3,2,5,4,6,*pi;coutmax1=max1(b,6)endl;/实参为数组名,形参为数组 coutmax2=max2(b,6)endl;/实参为数组名,形参为指针变量 pi=b;coutmax3=max3(pi,6)endl;/实参为指针变量,形参为数组 pi=b;coutmax4=max4(pi,6)endl;/实参为指针变量,形参指针变量返回返回例7.14(1)#include void sor
41、t1(int a,int n)/形参为数组名 int i,j,temp;for(i=0;in-1;i+)/使用冒泡法升序排序 for(j=0;jaj+1)temp=aj;aj=aj+1;aj+1=temp;void sort2(int*p,int n)/形参为指针 int i,j,temp;for(i=0;in-1;i+)/使用选择法降序排序 for(j=i+1;jn;j+)if (*(p+i)*(p+j)temp=*(p+i);*(p+i)=*(p+j);*(p+j)=temp;例7.14(2)void sort3(int a,int n)/形参为数组名 int i,j,k,temp;for
42、(i=0;in-1;i+)/使用擂台法升序排序 k=i;for(j=i+1;j*(a+j)k=j;if (ki)temp=*(a+i);*(a+i)=*(a+k);*(a+k)=temp;例7.14(3)void sort4(int*p,int n)/形参为指针 int i,j,k,temp;for(i=0;in-1;i+)/使用擂台法降序排序 k=i;for(j=i+1;jn;j+)if (pki)temp=pi;pi=pk;pk=temp;例7.14(4)void main(void)int a6=1,3,2,5,4,6,*p,i;sort1(a,6);/实参为数组名,形参为数组 for(
43、i=0;i6;i+)coutait;coutendl;sort2(a,6);/实参为数组名,形参为指针变量 for(i=0;i6;i+)coutait;coutendl;例7.14(5)p=a;sort3(p,6);/实参为指针变量,形参为数组 for(i=0;i6;i+)coutait;coutendl;p=a;sort4(p,6);/实参为指针变量,形参指针变量 for(i=0;i6;i+)coutait;coutendl;返回返回例7.15#include void main(void)int i;char c34=ABC,DEF,GHI;char*pc3=c0,c1,c2;for(i=
44、0;i3;i+)coutci=ci=pcin;返回返回例7.16#include#include void main(void)char c520,char*s5,*pc;int i,j;cout”Input 5 string:”endl;for(i=0;isi;for(i=0;i4;i+)for(j=i+1;j0)pc=si;si=sj;sj=pc;for(i=0;i5;i+)coutsit;coutendl;for(i=0;i5;i+)coutcit;返回返回例7.17(1)#include void main(void)int i,j,sum=0;int a33,(*p)3;/定义指向一
45、维数组的指针变量 p cout输入a33各元素值:endl;for(i=0;i3;i+)p=a+i;/将第i行的行地址赋给p for(j=0;j(*p)j;/用(*p)j输入aij的值 例7.17(2)for(p=a;pa+3;p+)for(j=0;j3;j+)sum+=(*p)j;/等价于sum+=aij;coutsum=sumendl;输入a33各元素值:123456789sum=45返回返回例7.18(1)#include int sum(int(*p)3,int m)/形参p为指向一维数组的指针变量 int i,j,sum=0;for(i=0;im;i+)for(j=0;j3;j+)s
46、um+=(*p)j;/(*p)j表示aij的元素值 p+;/p+后,p将指向下一行 return sum;例7.18(2)void main(void)int i,j,a33;cout输入a33各元素值:endl;for(i=0;i3;i+)for(j=0;jaij;coutsum=sum(a,3)endl;/实参为行指针,输入a33各元素值:123456789sum=45返回返回例7.19#include int*max(int x,int y)/定义返回指针的函数 int z=xy?x:y;return&z;/返回最大值变量z的地址 void main(void)int a=5,b=9,*
47、p;p=max(a,b);/调用函数后返回最大值变量z的地址给指针变量p coutmax=*pendl;/*p(=z)表示最大值单元的内容9程序执行后输出:max=9 返回返回例7.20#include char *str_cat(char*p1,char*p2)char*p3=p1;/将目标串首地址赋给指针变量将目标串首地址赋给指针变量p。while(*p1+);/指针指针p1移到移到s1的串尾的串尾 p1;while(*p1+=*p2+);/将源串将源串s2中的字符依次复制到目标串中的字符依次复制到目标串s1中。中。return p3;/返回指向目标串首地址的指针返回指向目标串首地址的指针
48、p。void main(void)char s1200,s2100,*p;cout输入第一个字符串:输入第一个字符串:;cin.getline(s1,100);cout输入第二个字符串:输入第二个字符串:;cin.getline(s2,100);cout“拼接后的字符串:拼接后的字符串:”;p=str_cat(s1,s2);coutpendl;/将字符串将字符串s2拼接到字符串拼接到字符串s1后输出后输出s1的内容。的内容。返回返回例7.21(1)#include#include char*encrypt(char*pstr)/定义加密函数为返回指针值的函数定义加密函数为返回指针值的函数 ch
49、ar*p=pstr;/保存字符串首地址到指针变量保存字符串首地址到指针变量p while(*pstr)if(*pstr=48&*pstr=65&*pstr=97&*pstr=122)*pstr+=5;pstr+;/指针变量加指针变量加1,指向下个单元,指向下个单元 return p;/返回字符串指针返回字符串指针例7.21(2)void main(void)char s80;cin.getline(s,80);/输入字符串到数组s cout encrypt(s)endl;/将字符串加密后输出 程序执行时输入:123ABCabc 加密后输出:!#*+,fgh返回返回例7.22(1)#includ
50、e#include float f1(float x)return(1+x);float f2(float x)return(x/(1+x*x);float f3(float x)return(x+x*x)/(1+cos(x)+x*x);例7.22(2)void main(void)float y1,y2,y3;float(*pf)(float x);/定义函数指针变量定义函数指针变量pf pf=f1;/将函数将函数f1入口地址赋给函数指针变量入口地址赋给函数指针变量pf y1=pf(1);/用函数指针变量用函数指针变量pf调用函数调用函数pf(1),计算,计算f1(1)的值的值 pf=f2;