C++指针的运用PPT课件_第1页
C++指针的运用PPT课件_第2页
C++指针的运用PPT课件_第3页
C++指针的运用PPT课件_第4页
C++指针的运用PPT课件_第5页
已阅读5页,还剩46页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、2020/6/16,精选,1,第5章指针的应用,5.1、指针概述一、内存地址的概念地址编码的基本单位是字节,每个字节是一个基本内存单元。二、从内存单元中存取数据的方法1、通过变量名,称为直接访问方式,直接对变量的存储单元进行存取访问。在变量获得内存空间的同时,变量名也就成为了相应内存空间的名称,在变量的整个生存期内都可以用这个名字访问该内存空间,表现在程序语句中就是通过变量名存取变量内容。,2020/6/16,精选,2,2、通过地址,称为间接访问方式,先找到存放变量的地址的变量,得到变量的地址,再根据变量的地址找到变量的存储单元,对它进行存取访问。C+拥有在运行时获得变量的地址和操纵地址的能力

2、。变量的地址可以使用地址运算符voidmain()inta;int*p;a=10;p=,2020/6/16,精选,5,5.2、指针变量的定义、赋值及使用一、指针变量的定义指针本身也是一种变量,须先声明后使用。声明指针类型的变量是在声明变量的同时加上*来完成的。对应于各种类型的数据都有相应的指针类型。*放在指针定义中时,被称为指针定义符。放在可执行语句中的指针前被称为指针运算符,也称为“间接访问”运算符。,2020/6/16,精选,6,指针变量的声明语句,由数据类型后跟星号,再跟随指针变量名组成。数据类型*指针变量名;如:int*iptr;int*iptr;int*iptr;int*iptr;在

3、指针定义中,一个*只能表示一个指针。int*iptr1,iptr2;/iptr1指针变量,iptr2整型变量int*iptr1,*iptr2;/两个指针变量,2020/6/16,精选,7,地址和指针的关系intx,*ptr;x=3;ptr=/x=11,2020/6/16,精选,8,二、指针变量的赋值与变量定义一样,定义好指针变量后也可以对它进行初始化,指针变量可以初始化为0、NULL或一个地址。数值为0或者NULL的指针不指任何内容。数值0是可以直接赋给指针变量的唯一整数值。1.在定义指针变量的同时进行初始化赋值,一般格式如下:数据类型*指针名初始地址;,2020/6/16,精选,9,2.定义

4、指针变量后,用赋值语句将其初始化。指针变量名=地址;可以是变量的地址、数组名、函数名等。用变量地址作为初值时,该变量的定义必须在指针初始化之前定义。不能把常量或表达式的地址赋给指针变量。不能将一个非0整数直接赋给指针变量,但可以赋整数值0,表示该指针为空指针。例如:int*p;p=0;p为空指针,不指向任何地址。,2020/6/16,精选,10,3.允许声明指向void类型的指针,该指针可以被赋予任何类型对象的地址。例如:void*general;int*point;inti;general=,2020/6/16,精选,11,例5.2、阅读如下程序:源程序清单:#includeusingnam

5、espacestd;voidmain()intx;int*p;int*q;inta=3;int*pa=,2020/6/16,精选,12,#includeusingnamespacestd;voidmain()intx=3,*ptr=/变量x的地址,2020/6/16,精选,13,三、指针变量的使用例5.3、阅读如下程序:源程序清单:#includeusingnamespacestd;voidmain()intx,*p;p=,2020/6/16,精选,14,指针在使用前要进行初始化或赋值,指针未赋值将非常危险。#includeusingnamespacestd;voidmain()intx=26

6、;int*ptr;*ptr=58;/此时ptr是一个随机地址coutxendl;很可能已经破坏了另一变量的值,甚至修改了函数的返回地址等。,2020/6/16,精选,15,5.3、简单变量与指针指针的类型是它所指向变量的类型。指针值不是整型数,在使用中必须类型匹配。如:intx=26;int*ptr=表示将变量x的地址值作为一个整型数赋给变量*ptr,即变量x。,2020/6/16,精选,16,因为指针是有类型的,所以给指针赋值不但要是一个地址,而且应该是一个与该指针类型相符的变量的地址。或者说指针的类型是它所指向变量的类型。floatf=34.5,*fptr=/error:浮点指针赋给整型指

7、针将一个指针赋值给另一个指针,结果是两个指针指向一个相同的地址单元。,2020/6/16,精选,17,例5.4、阅读如下程序:源程序清单:#includeusingnamespacestd;voidmain()intx,*p;x=3;p=,2020/6/16,精选,18,例5.5、输入a和b两个整数,运用指针技术按先大后小的顺序输出a和b。源程序清单:#include#includeusingnamespacestd;voidmain(void)/利用间接访问方式来操作,2020/6/16,精选,19,inta,b;int*p1=,2020/6/16,精选,20,指针变量的运算指针的算术运算指

8、针加一,减一运算是指向下一个或前一个数据。如:y=*px+相当于y=*(px+)/px为一指针指针与整数的加减运算指针p加上或减去n,其意义是指针当前指向位置的前方或后方第n个数据的地址。这种运算的结果值取决于指针指向的数据类型。,2020/6/16,精选,21,2020/6/16,精选,22,pb-1,pb,pb+1,pb+2,*(pb-1),*pb,*(pb+1),*(pb+2),int*pb,2020/6/16,精选,23,#includeusingnamespacestd;voidmain()intn=20,*ptr=,2020/6/16,精选,24,关系运算表示所指变量在内存中的位置

9、关系如:两个指针变量指向同一个数组中的元素时,其关系运算的结果表明了这两个指针变量所指向的数组元素的先后关系chara10;char*p1,*p2;p1=a+2;p2=a+4;p1+;p2-;指针可以和零之间进行等于或不等于的关系运算。例如:p=0;/表示空指针,2020/6/16,精选,25,例5.5、编写一交换两个整型变量值的函数,并写一主函数测试。#includeusingnamespacestd;voidswap(int*x,int*y)intt;t=*x,*x=*y,*y=t;voidmain()inta=1,b=2;cout交换前:a=a,b=bendl;swap(,2020/6/

10、16,精选,26,5.4、一维数组与指针数组名可以拿来初始化指针,数组名就是数组第一个元素的地址,即对于数组a,有a=对第i个元素可表示成以下四种:ai、*(a+i)、iptri、*(iptr+i)这四个等价关系使得数组与指针相互转换非常灵活。,2020/6/16,精选,27,与上面相对应的有下面四个地址等价关系:intsum1,sum2,sum3,sum4,sum5,*iPtr;intiArray=1,4,2,7,13,32,21,48,16,30;voidmain()intsize,n;size=sizeof(iArray)/sizeof(*iArray);/sizeof(iArray):

11、数组iArray所占字节数/sizeof(*iArray):数组元素类型所占字节数for(n=0;nsize;n+)sum1+=iArrayn;/方法1,2020/6/16,精选,29,iPtr=iArray;/方法2for(n=0;nsize;n+)sum2+=*iPtr+;iPtr=iArray;/方法3for(n=0;nsize;n+)sum3+=*(iPtr+n);iPtr=iArray;/方法4for(n=0;nsize;n+)sum4+=iPtrn;/方法5for(n=0;nsize;n+)sum5+=*(iArray+n);coutsum1=sum1,sum2=sum2,sum3

12、=sum3,sum4=sum4,sum5=sum5endl;,2020/6/16,精选,30,例5.7、阅读如下程序:源程序清单:#includeusingnamespacestd;voidmain()chara10=abcdefghi;char*p1,*p2;p1=a;p1+=2;,2020/6/16,精选,31,p2=a+4;/指针变量p2,直接由数组名加上4,指向数组的第五个数组元素的内存单元if(p1p2)coutp1所指向的数组元素在p2所指向的数组元素前面!endl;elsecoutp1所指向的数组元素在p2所指向的数组元素后面!endl;p1+;p2-;if(p1=p2)cout

13、p1和p2同时指向数组中的同一个元素且元素值为:*p1endl;elsecoutp1和p2没有指向数组中的同一个元素!*p;p=a;,2020/6/16,精选,34,for(i=0,j=10-1;ij;i+,j-)temp=*(p+i);*(p+i)=*(p+j);*(p+j)=temp;for(p=a;pa+10;p+)coutsetw(4)*p;coutx;t=a;p=0;while(x*(t+p),2020/6/16,精选,37,例5.10、从键盘输入整数集合a、b的元素个数和各个元素的值(不相同),计算并输出其交集。#includeusingnamespacestd;#includev

14、oidmain(void)constintM=20,N=10;intaM,bN,cM;intd,e,f=0,*pa,*pb,*pc;,2020/6/16,精选,38,coutd;cout*pa;coute;cout*pb;,2020/6/16,精选,39,for(pa=a,pc=c;paa+d;pa+)for(pb=b;pbb+e;pb+)if(*pa=*pb)*pc+=*pa;f+;break;cout交集c的各个元素依次为:endl;for(pc=c;pcc+f;pc+)coutsetw(3)*pc;cout*pa;coute;cout*pb;,2020/6/16,精选,42,for(pa

15、=a,pc=c;pa=a+d)*pc+=*pb;f+;cout“并集c的各个元素依次为:endl;for(pc=c;pcc+f;pc+)coutsetw(3)*pc;coutendl;,2020/6/16,精选,43,例5.12、编程实现将一个数组中的数据按相反顺序存放。思路分析:用一个子函数实现按相反顺序存放,主函数调用该子函数实现按相反顺序存放。#includeusingnamespacestd;voidinvert(int*p,intn)inti,j,temp;for(i=0,j=n-1;iai;invert(a,10);for(i=0;i10;i+)coutaiendl;return0

16、;,2020/6/16,精选,45,5.5、二维数组与指针例5.13、利用指针技术,输出如下二维数组各元素的值。inta34=1,2,3,4,5,6,7,8,9,10,11,12源程序清单1:#include#includeusingnamespacestd;voidmain(void),2020/6/16,精选,46,inta34=1,2,3,4,5,6,7,8,9,10,11,12;int*p;for(p=a0;pa0+12;p+)if(p-a0)%4=0)coutendl;coutsetw(4)*p;coutendl;,2020/6/16,精选,47,源程序清单2:#include#includeusingn

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论