C++课件:第10章 指针.ppt
《C++课件:第10章 指针.ppt》由会员分享,可在线阅读,更多相关《C++课件:第10章 指针.ppt(56页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第10章 指针主要内容:主要内容:主要内容:主要内容:(1 1)指针和地址)指针和地址(2 2)指针常量和指针变量)指针常量和指针变量(3 3)指针与数组的结合应用)指针与数组的结合应用(4 4)指针与函数的结合应用)指针与函数的结合应用(5 5)指针数组与指向指针的指针变量)指针数组与指向指针的指针变量重点:重点:重点:重点:指针变量的定义与引用指针变量的定义与引用通过指针访问数组元素通过指针访问数组元素指针变量作为函数参数指针变量作为函数参数返回指针值的函数返回指针值的函数10.1 指针和指针变量指针和指针变量 n n例例10.110.1:数据的:数据的直接访问直接访问直接访问直接访问与与
2、间接访问间接访问间接访问间接访问:main()a pmain()a p int int a,*p;FFD6H a,*p;FFD6H scanfscanf(%d,&a);(%d,&a);p=&a;p=&a;/*/*变量变量p p保存保存a a的地址的地址*/*/printfprintf(“n a=%d”,a);(“n a=%d”,a);/*/*通过变量名访问单元:通过变量名访问单元:FFD6H*/FFD6H*/printfprintf(“n*p:%d”,*p);(“n*p:%d”,*p);/*/*通过指针变量通过指针变量P P访问单元访问单元:ffd6h*/ffd6h*/printfprintf
3、(“n p:%xn”,p);(“n p:%xn”,p);/*/*输出变量输出变量p p的值,即的值,即a a的地址的地址*/指针指针:就是就是地址地址,变量的指针即指向该变量的地址。,变量的指针即指向该变量的地址。指针变量:指针变量:存放存放内存内存(变量、数组、函数等)地址的变量(变量、数组、函数等)地址的变量。25FFD6H指针变量指针变量n n例例10.2 10.2 交换两个指针变量所指向的变量的值。交换两个指针变量所指向的变量的值。main()main()int int a=10,b=20,t;a=10,b=20,t;intint*p1,*p2*p1,*p2;/*;/*定义指向整型的指
4、针变量定义指向整型的指针变量定义指向整型的指针变量定义指向整型的指针变量p1,p2*/p1,p2*/p1=&a;p2=&b;/*p1=&a;p2=&b;/*使使使使p1 p1 指向指向指向指向 a,p2 a,p2 指向指向指向指向 b*/b*/printfprintf(n before exchange:a=%d,b=%d,a,b);(n before exchange:a=%d,b=%d,a,b);t=*p1;*p1=*p2;*p2=t;t=*p1;*p1=*p2;*p2=t;/*/*交换交换交换交换p1,p2p1,p2指向的变量的值指向的变量的值指向的变量的值指向的变量的值*/*/prin
5、tfprintf(n after exchange:a=%d,b=%d,a,b);(n after exchange:a=%d,b=%d,a,b);printf printf(n*p1:%d,*p2:%d,*p1,*p2);(n*p1:%d,*p2:%d,*p1,*p2);图示其执行过程:图示其执行过程:图示其执行过程:图示其执行过程:见下页见下页见下页见下页本例中指针变量的作用:通过指针变量访问该指针变量指向的单元,指针变量的值不变。n n指针变量的定义的一般格式为:指针变量的定义的一般格式为:指针变量的定义的一般格式为:指针变量的定义的一般格式为:类型标识符类型标识符类型标识符类型标识符
6、*指针变量名指针变量名指针变量名指针变量名 n n例如例如:intint*p;*p;float*q;float*q;n n指针变量的引用:指针变量的引用:指针变量的引用:指针变量的引用:必须先定义,后使用必须先定义,后使用必须先定义,后使用必须先定义,后使用指针变量定义后,可以对其进行如下操作:指针变量定义后,可以对其进行如下操作:赋值、引用指针变量的值、访问指针变量指向的变量赋值、引用指针变量的值、访问指针变量指向的变量赋值、引用指针变量的值、访问指针变量指向的变量赋值、引用指针变量的值、访问指针变量指向的变量等。等。等。等。如上例中通过如上例中通过如上例中通过如上例中通过p1p1、p2p2
7、访问变量访问变量访问变量访问变量a a、b b对应的单元,其中对应的单元,其中对应的单元,其中对应的单元,其中p1p1表示指针变量,表示指针变量,表示指针变量,表示指针变量,*p1p1表示表示表示表示p1p1指向的变量(即变量指向的变量(即变量指向的变量(即变量指向的变量(即变量a a),),),),&p1&p1表示指针变量表示指针变量表示指针变量表示指针变量p1p1所在单元的地址所在单元的地址所在单元的地址所在单元的地址。回顾例回顾例10.210.2:通过指针变量:通过指针变量p1p1,p2p2交换了变量交换了变量a a和和b b的值。的值。那么,为什么要用指针变量而不直接用变量名呢?那么,
8、为什么要用指针变量而不直接用变量名呢?再回顾函数一章的例再回顾函数一章的例8.48.4:编写函数:编写函数swap()swap()交换两个变量的值,交换两个变量的值,函数如下:函数如下:viod viod swap(swap(int int a,a,int int b)b)int int t;t=a;a=b;b=t;t;t=a;a=b;b=t;main()main()int int x=5,y=6;x=5,y=6;swap(x,y);swap(x,y);printfprintf(nxnx=%d,y=%d,x,y);=%d,y=%d,x,y);结果结果:x=5,y=6 x=5,y=6 程序并未实
9、现交换程序并未实现交换x x、y y的值的值,why?why?因为因为参数传递是单向的,对形参的改变不影响实参的值。参数传递是单向的,对形参的改变不影响实参的值。指针变量作函数参数指针变量作函数参数解决以上问题的方法是:解决以上问题的方法是:指向变量的指针变量作函数形参,接收主调函数指向变量的指针变量作函数形参,接收主调函数指向变量的指针变量作函数形参,接收主调函数指向变量的指针变量作函数形参,接收主调函数中实参变量的地址,实现传地址调用。中实参变量的地址,实现传地址调用。中实参变量的地址,实现传地址调用。中实参变量的地址,实现传地址调用。即在被调函数中通过指针变量访问(读取或修改)即在被调函
10、数中通过指针变量访问(读取或修改)主调函数中对应的变量,当返回主调函数后,主调函数中对应的变量,当返回主调函数后,主调函数就得到了这些已修改过的变量的值。主调函数就得到了这些已修改过的变量的值。因此,因此,“传地址传地址”调用可以实现函数间多个数调用可以实现函数间多个数据的据的“双向传递双向传递”。main()/*main()/*编写函数交换两个变量的值编写函数交换两个变量的值编写函数交换两个变量的值编写函数交换两个变量的值*/*/intint a,b;a,b;void swap(void swap(intint*p,*p,intint*q)*q);printf printf(n input
11、2 integers:);(n input 2 integers:);scanf scanf(%d%d,&a,&b);(%d%d,&a,&b);printf printf(n before swap:a=%d,b=%d,a,b);(n before swap:a=%d,b=%d,a,b);swap(&a,&b);swap(&a,&b);printf printf(n after swap:a=%d,b=%d,a,b);(n after swap:a=%d,b=%d,a,b);void swap(void swap(intint*p,*p,intint*q)/*q)/*交换两个变量的值交换两个变
12、量的值交换两个变量的值交换两个变量的值*/*/intint t;t;t=*p;*p=*q;*q=t;t=*p;*p=*q;*q=t;调用过程中参数的对应关系调用过程中参数的对应关系:Main:swap:a p b q *p a *q b 因此,在因此,在swapswap函数中通过指针变量函数中通过指针变量p p、q q就可以访问就可以访问mainmain函数中的变量函数中的变量a a、b b了。由此可以实现函数之间的多个了。由此可以实现函数之间的多个“数据传递数据传递”。&a&b10.2 指针与数组指针与数组n n 通过指针访问数组元素通过指针访问数组元素 10.2.1 指针与一维数组指针与一
13、维数组int int a6,*pa,k;a6,*pa,k;a:a0 a1 a5 After execute:pa=a;a0 a1 a5 a:pa pa+1 pa+2例例例例10.10.5 5 分分别别用用下下标标法法和和指指针法访问一维数组。针法访问一维数组。程序(程序(1 1):下标法):下标法main()main()int int a 5=1,2,3,5,7,i;a 5=1,2,3,5,7,i;for(i=0;i5;i+)for(i=0;i5;i+)printf printf(%4d,ai);(%4d,ai);程序(程序(2 2):指针法):指针法main()main()intint a5
14、=1,2,3,5,7,a5=1,2,3,5,7,*p;*p;for(p=a;pa+5;p+)for(p=a;pa+5;p+)printf printf(%5d,*p);(%5d,*p);程序(3):地址法(指针常量)main()int a5=1,2,3,5,7,i;for(i=0;is =str strn n例例10.610.6编写函数实现:将数组中的编写函数实现:将数组中的n n个整数逆序存放。个整数逆序存放。调用该函数实现将调用该函数实现将1010个整数逆序存放。个整数逆序存放。main()main()int int a10=1,2,4,6,8,9,7,5,3,10,i;a10=1,2,4
15、,6,8,9,7,5,3,10,i;int int*p;*p;void inv(void inv(intint*q,*q,int int n);/*n);/*函数声明函数声明*/*/printfprintf(n before inverse:n);(n before inverse:n);for(p=a;pa+10;p+)for(p=a;pa+10;p+)printfprintf(“%5d”,*p);(“%5d”,*p);/*/*用指针访问数组元素用指针访问数组元素*/*/inv(a,10);inv(a,10);printfprintf(n after inverse:n);(n after
16、inverse:n);for(i=0;i10;i+)for(i=0;i10;i+)printf printf(“%5d”,ai);(“%5d”,ai);/*/*用下标访问用下标访问*/*/void inv(int*q,int n)/*函数inv()实现逆序*/int*i,*j,t;for(i=q,j=q+n-1;ij;i+,j-)t=*i;*i=*j;*j=t;return;3 3、调用函数、调用函数inv()inv()时,实参与形参的对应关系:时,实参与形参的对应关系:实参:实参:实参:实参:a 10 a 10 形参:形参:形参:形参:q nq nn n结果:指针变量结果:指针变量q q接收
17、数组接收数组a a的首地址,即的首地址,即q q指向数组指向数组a a的第一的第一个数组元素。因此,在函数个数组元素。因此,在函数inv()inv()中通过指针变量中通过指针变量i,ji,j改变的是改变的是数组数组a a的元素。的元素。n n函数函数inv()inv()与下面的函数与下面的函数inverinver()()功能等价:功能等价:void void inverinver(int int b ,b ,intint n)n)int int i,j,t;i,j,t;for(i=0,j=n-1;ij;i+,j-)for(i=0,j=n-1;ij;i+,j-)t=bi;bi=bj;bj=t;t
18、=bi;bi=bj;bj=t;return;return;说明说明:形参数组名与指针变量等价形参数组名与指针变量等价形参数组名与指针变量等价形参数组名与指针变量等价。此处用。此处用b b接收接收a a的首地址,的首地址,实现通过数组名实现通过数组名b b访问数组访问数组a.a.指针法与下标法访问数组的区别指针法与下标法访问数组的区别:用指针速度快。用指针速度快。10.2.2 指针与二维数组指针与二维数组n n1 1、可以将二维数组看作一个一维数组进行访问可以将二维数组看作一个一维数组进行访问可以将二维数组看作一个一维数组进行访问可以将二维数组看作一个一维数组进行访问:通过指向数组元素的指针访问
19、各元素通过指向数组元素的指针访问各元素通过指向数组元素的指针访问各元素通过指向数组元素的指针访问各元素。n n例例10.8 10.8 利用指针变量输出整型二维数组利用指针变量输出整型二维数组ssss中的各元素。中的各元素。main()main()int ss int ss23=2,4,6,8,10,12;23=2,4,6,8,10,12;int int*p;*p;printf printf(n);(n);for(for(p=p=ssss00;p;pssss0+6;p+)0+6;p+)/*p=/*p=ssss00与与与与p=&p=&ssss0000等价等价等价等价*/*/printfprintf
20、(%6d,*p);(%6d,*p);说明:说明:因为p是指向整型数据的指针变量,因此初值应为第一个数组元素的地址第一个数组元素的地址,p+使得使得p指向指向下一个数组元素下一个数组元素。n n图示:p 24681012S00S01S02S10S11S122 2、利用指向一维数组的指针变量访问二维数组。利用指向一维数组的指针变量访问二维数组。利用指向一维数组的指针变量访问二维数组。利用指向一维数组的指针变量访问二维数组。例例例例10.9 10.9 利用指向一维数组的指针变量利用指向一维数组的指针变量利用指向一维数组的指针变量利用指向一维数组的指针变量p p输出数组输出数组输出数组输出数组ssss
21、2424中的各元素。中的各元素。中的各元素。中的各元素。main()main()int ss int ss24=2,4,6,8,10,12,14,16;24=2,4,6,8,10,12,14,16;int int (*p)4(*p)4,j;,j;printf printf(n);(n);for(p=for(p=ssss;p;pssss+2;p+)+2;p+)for(j=0;j4;j+)for(j=0;j4;j+)printf printf(%6d,(%6d,*(*p)+j)*(*p)+j);/*equal to:);/*equal to:(*p)j(*p)j */*/说明:p是指向一个包含有是
22、指向一个包含有4个元素的一维个元素的一维数组的指针变量,因此,数组的指针变量,因此,p+的含义是的含义是:使使 p 指向下一个一维数组指向下一个一维数组,即移动4个元素的位置。(与例10.8中的p+比较)。*(*p)+j)的含义的含义:p所指向的一维数组中所指向的一维数组中下标为下标为j 的元素。的元素。等价于等价于(*p)jn n通过以上两例比较,可以看出两种指针变量的使通过以上两例比较,可以看出两种指针变量的使用区别:用区别:指向数组元素的指针变量可以访问指向数组元素的指针变量可以访问任意任意任意任意长度长度长度长度的数组,指向一维数组的指针变量只能访问的数组,指向一维数组的指针变量只能访
23、问固定长度固定长度固定长度固定长度的数组。的数组。n n应用应用:当需用指针变量作为函数参数,编写处理:当需用指针变量作为函数参数,编写处理任意二维数组的数据时,用方法任意二维数组的数据时,用方法1 1更合适。更合适。n n例例10.10 10.10 编写函数实现:求编写函数实现:求m*nm*n矩阵中最大值元素矩阵中最大值元素的下标。并编写主函数调用之,在主函数中输出的下标。并编写主函数调用之,在主函数中输出结果(结果(较高要求的练习较高要求的练习)。)。n n分析分析:设函数名为设函数名为maxmax,类型为类型为void,void,参数有参数有5 5个,个,分别表示数组元素的首地址、行列数
24、分别表示数组元素的首地址、行列数m,nm,n、最大值最大值元素的行列下标地址元素的行列下标地址 r,cr,c。算法算法(略略):main()main()int ss int ss43=1,12,3,14,5,16,7,8,9,2,13,4;43=1,12,3,14,5,16,7,8,9,2,13,4;int int max_r,max_c;void max();max_r,max_c;void max();max(max(ssss0,4,3,&max_r,&max_c);0,4,3,&max_r,&max_c);printf printf(n max:%d,row:%d,(n max:%d,r
25、ow:%d,columcolum:%d,:%d,ss ssmax_rmax_c,max_r,max_c);max_rmax_c,max_r,max_c);void max(void max(intint*p,*p,int int m,m,int int n,n,int int*r,*r,int int*c)*c)int int i,j,i,j,krkr,kckc;/*;/*krkr,kckc分别为最大值元素的行列下标分别为最大值元素的行列下标分别为最大值元素的行列下标分别为最大值元素的行列下标*/*/krkr=kckc=0;=0;for(i=0;im;i+)for(i=0;im;i+)for(
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- C+课件:第10章 指针 C+ 课件 10
限制150内