C++指针的运用

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

2020/9/201第5章指针的应用§5.1、指针概述一、内存地址的概念地址编码的基本单位是字节,每个字节是一个基本内存单元。二、从内存单元中存取数据的方法1、通过变量名,称为直接访问方式,直接对变量的存储单元进行存取访问。在变量获得内存空间的同时,变量名也就成为了相应内存空间的名称,在变量的整个生存期内都可以用这个名字访问该内存空间,表现在程序语句中就是通过变量名存取变量内容。2020/9/2022、通过地址,称为间接访问方式,先找到存放变量的地址的变量,得到变量的地址,再根据变量的地址找到变量的存储单元,对它进行存取访问。C++拥有在运行时获得变量的地址和操纵地址的能力。变量的地址可以使用地址运算符&求得,在某一变量前加上地址运算符&,则为该变量的地址,如:&x表示变量x的地址数组名表示数组的首地址;函数的地址用函数名表示。用来存放地址的变量就叫做指针型变量,简称指针。2020/9/203假设ptr为一指针,则语句:ptr=&x;就将变量x的地址存入了指针ptr中。也经常简称为“指针ptr指向变量x”。可以通过指针得到变量x的值或改变变量x的值:*ptr=2;//相当于x=2y=*ptr;//将x的值赋给y2020/9/204例5.1、阅读如下程序:源程序清单:#includeiostreamusingnamespacestd;voidmain(){inta;int*p;a=10;p=&a;couta的值表示方法1:aendl;couta的值表示方法2:*pendl;couta的地址表示方法1:&aendl;couta的地址表示方法2:pendl;}2020/9/205§5.2、指针变量的定义、赋值及使用一、指针变量的定义指针本身也是一种变量,须先声明后使用。声明指针类型的变量是在声明变量的同时加上*来完成的。对应于各种类型的数据都有相应的指针类型。*放在指针定义中时,被称为指针定义符。放在可执行语句中的指针前被称为指针运算符,也称为“间接访问”运算符。2020/9/206指针变量的声明语句,由数据类型后跟星号,再跟随指针变量名组成。数据类型*指针变量名;如:int*iptr;int*iptr;int*iptr;int*iptr;在指针定义中,一个*只能表示一个指针。int*iptr1,iptr2;//iptr1—指针变量,iptr2整型变量int*iptr1,*iptr2;//两个指针变量2020/9/207地址和指针的关系intx,*ptr;x=3;ptr=&x;如果ptr指向x,那么*ptr的值为x的值,以后对*ptr的赋值等价于对x的赋值。#includeiostreamusingnamespacestd;voidmain(){intx=3,*ptr;ptr=&x;*ptr=11;coutxendl;//x=11}2020/9/208二、指针变量的赋值与变量定义一样,定义好指针变量后也可以对它进行初始化,指针变量可以初始化为0、NULL或一个地址。数值为0或者NULL的指针不指任何内容。数值0是可以直接赋给指针变量的唯一整数值。1.在定义指针变量的同时进行初始化赋值,一般格式如下:数据类型*指针名=初始地址;2020/9/2092.定义指针变量后,用赋值语句将其初始化。指针变量名=地址;可以是变量的地址、数组名、函数名等。用变量地址作为初值时,该变量的定义必须在指针初始化之前定义。不能把常量或表达式的地址赋给指针变量。不能将一个非0整数直接赋给指针变量,但可以赋整数值0,表示该指针为空指针。例如:int*p;p=0;p为空指针,不指向任何地址。2020/9/20103.允许声明指向void类型的指针,该指针可以被赋予任何类型对象的地址。例如:void*general;int*point;inti;general=&i;point=(int*)general;2020/9/2011例5.2、阅读如下程序:源程序清单:#includeiostreamusingnamespacestd;voidmain(){intx;int*p;int*q;inta=3;int*pa=&a;p=&x;q=p;cout*paendl;}2020/9/2012#includeiostreamusingnamespacestd;voidmain(){intx=3,*ptr=&x;*ptr=52;coutxendl;//52cout*ptrendl;//52coutptrendl;//变量x的地址cout&xendl;//变量x的地址}2020/9/2013三、指针变量的使用例5.3、阅读如下程序:源程序清单:#includeiostreamusingnamespacestd;voidmain(){intx,*p;p=&x;cin*p;cout*pendl;}2020/9/2014指针在使用前要进行初始化或赋值,指针未赋值将非常危险。#includeiostreamusingnamespacestd;voidmain(){intx=26;int*ptr;*ptr=58;//此时ptr是一个随机地址coutxendl;}很可能已经破坏了另一变量的值,甚至修改了函数的返回地址等。2020/9/2015§5.3、简单变量与指针指针的类型是它所指向变量的类型。指针值不是整型数,在使用中必须类型匹配。如:intx=26;int*ptr=&x;//定义指针变量*ptr=&x;//error:不能将整型地址转换成整型数*ptr=50;//执行语句:*在此处作间接引用可以对不同的类型作强制转换,如:*ptr=(int)&x;表示将变量x的地址值作为一个整型数赋给变量*ptr,即变量x。2020/9/2016因为指针是有类型的,所以给指针赋值不但要是一个地址,而且应该是一个与该指针类型相符的变量的地址。或者说指针的类型是它所指向变量的类型。floatf=34.5,*fptr=&f;//浮点指针int*iptr=&f;//error:浮点变量地址赋给整型指针iptr=fptr;//error:浮点指针赋给整型指针将一个指针赋值给另一个指针,结果是两个指针指向一个相同的地址单元。2020/9/2017例5.4、阅读如下程序:源程序清单:#includeiostreamusingnamespacestd;voidmain(){intx,*p;x=3;p=&x;*p=*p+10;cout*pendl;}2020/9/2018例5.5、输入a和b两个整数,运用指针技术按先大后小的顺序输出a和b。源程序清单:#includeiostream#includeiomanipusingnamespacestd;voidmain(void){//利用间接访问方式来操作2020/9/2019inta,b;int*p1=&a;int*p2=&b;coutinputaandb:endl;cin*p1*p2;if(*p1*p2)cout按先大后小的顺序输出的a和b为:*p2setw(4)*p1endl;elsecout按先大后小的顺序输出的a和b为:*p1setw(4)*p2endl;}2020/9/2020指针变量的运算指针的算术运算指针加一,减一运算是指向下一个或前一个数据。如:y=*px++相当于y=*(px++)//px为一指针指针与整数的加减运算指针p加上或减去n,其意义是指针当前指向位置的前方或后方第n个数据的地址。这种运算的结果值取决于指针指向的数据类型。2020/9/2021pa-2pa-1pa+1pa+2pa+3*(pa-2)*pa*(pa+1)*(pa+2)*(pa+3)*(pa-1)short*pa2020/9/2022pb-1pbpb+1pb+2*(pb-1)*pb*(pb+1)*(pb+2)int*pb2020/9/2023#includeiostreamusingnamespacestd;voidmain(){intn=20,*ptr=&n,*ptr1,y;y=*ptr;coutptr=ptr'\t'y=yendl;y=*(ptr++);//y=*(++ptr);coutptr=ptr'\t'y=yendl;ptr1=ptr+3;y=*ptr1;coutptr=ptr1'\t'y=yendl;}2020/9/2024关系运算表示所指变量在内存中的位置关系如:两个指针变量指向同一个数组中的元素时,其关系运算的结果表明了这两个指针变量所指向的数组元素的先后关系chara[10];char*p1,*p2;p1=a+2;p2=a+4;p1++;p2--;指针可以和零之间进行等于或不等于的关系运算。例如:p==0;//表示空指针2020/9/2025例5.5、编写一交换两个整型变量值的函数,并写一主函数测试。#includeiostreamusingnamespacestd;voidswap(int*x,int*y){intt;t=*x,*x=*y,*y=t;}voidmain(){inta=1,b=2;cout交换前:a=a,b=bendl;swap(&a,&b);cout交换后:a=a,b=bendl;}2020/9/2026§5.4、一维数组与指针数组名可以拿来初始化指针,数组名就是数组第一个元素的地址,即对于数组a,有a=&a[0]。假设按下面定义数组a及指针iptr:inta[10],*iptr=a;对第i个元素可表示成以下四种:a[i]、*(a+i)、iptr[i]、*(iptr+i)这四个等价关系使得数组与指针相互转换非常灵活。2020/9/2027与上面相对应的有下面四个地址等价关系:&a[i]a+iiptr+i&iptr[i]a+i表示第i个数组元素的地址,iptr+i也同样是指向数组a的第i个数组元素。相互等价2020/9/2028例5.6、求数组元素的和#includeiostreamusingnamespacestd;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):数组iArray所占字节数//sizeof(*iArray):数组元素类型所占字节数for(n=0;nsize;n++)sum1+=iArray[n];//方法12020/9/2029iPtr=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+=iPtr[n];//方法5for(n=0;nsize;n++)sum5+=*(iArray+n);coutsum1=sum1,sum2=sum2\,sum3=sum3,sum4=sum4\,sum5=sum5endl;}2020/9/2030例5.7、阅读如下程序:源程序清单:#includeiostreamusingnamespacestd;voidmain(){chara[10]=abcdefghi;char*p1,*p2;p1=a;p1+=2;2020/9/2031p2=a+4;//指针变量p2,直接由数组名加上4,指向数组的第五个数组元素的内存单元if(p1p2)co

1 / 51
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功