(精品)C++课件第五章.ppt
《(精品)C++课件第五章.ppt》由会员分享,可在线阅读,更多相关《(精品)C++课件第五章.ppt(51页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、2023/4/101第5章 指针的应用5.1、指针概述指针概述一、内存地址的概念一、内存地址的概念地址编码的基本单位是字节,每个字节是一地址编码的基本单位是字节,每个字节是一个基本内存单元。个基本内存单元。二、二、从内存单元中存取数据的从内存单元中存取数据的 方法方法1 1、通过变量名,称为直接访问方式,直接对、通过变量名,称为直接访问方式,直接对变量的存储单元进行存取访问。在变量获得内存变量的存储单元进行存取访问。在变量获得内存空间的同时,变量名也就成为了相应内存空间的空间的同时,变量名也就成为了相应内存空间的名称,在变量的整个生存期内都可以用这个名字名称,在变量的整个生存期内都可以用这个名
2、字访问该内存空间,表现在程序语句中就是通过变访问该内存空间,表现在程序语句中就是通过变量名存取变量内容。量名存取变量内容。2023/4/1022 2、通过地址,称为间接访问方式,先找到存、通过地址,称为间接访问方式,先找到存放变量的地址的变量,得到变量的地址,再根据放变量的地址的变量,得到变量的地址,再根据变量的地址找到变量的存储单元,对它进行存取变量的地址找到变量的存储单元,对它进行存取访问。访问。C+C+拥有在运行时获得变量的地址和操纵地址拥有在运行时获得变量的地址和操纵地址的能力。变量的地址可以使用地址运算符的能力。变量的地址可以使用地址运算符&求得,求得,在某一变量前加上地址运算符在某
3、一变量前加上地址运算符&,则为该变量的,则为该变量的地址,如:地址,如:&x&x表示变量表示变量x x的地址的地址数组名表示数组的首地址;函数的地址用函数组名表示数组的首地址;函数的地址用函数名表示。数名表示。用来存放地址的变量就叫做指针型变量,简用来存放地址的变量就叫做指针型变量,简称指针。称指针。2023/4/103假设假设ptrptr为一指针,则语句:为一指针,则语句:ptrptr=&x;=&x;就将变量就将变量x x的地址存入了指针的地址存入了指针ptrptr中。中。也经常简称为也经常简称为“指针指针ptrptr指向变量指向变量x x”。可以通过指针得到变量可以通过指针得到变量x x的
4、值或改变变量的值或改变变量x x的值:的值:*ptrptr=2;=2;/相当于相当于 x=2x=2y=*y=*ptrptr;/将将x x的值赋给的值赋给y y2023/4/104例例5.15.1、阅读如下程序:阅读如下程序:源程序清单:源程序清单:#include#include using namespace std;using namespace std;void main()void main()intint a;a;intint*p;*p;a=10;a=10;p=&a;p=&a;coutcoutaa的值表示方法的值表示方法1 1:aaendlendl;coutcoutaa的值表示方法的
5、值表示方法2 2:*p*pendlendl;coutcoutaa的地址表示方法的地址表示方法1 1:&a&aendlendl;coutcoutaa的地址表示方法的地址表示方法2 2:ppendlendl;2023/4/1055.2、指针变量的定义、赋值及使用指针变量的定义、赋值及使用一、一、指针变量的定义指针变量的定义指针本身也是一种变量,须先声明后使用。指针本身也是一种变量,须先声明后使用。声明指针类型的变量是在声明变量的同时加声明指针类型的变量是在声明变量的同时加上上*来完成的。对应于各种类型的数据都有相应来完成的。对应于各种类型的数据都有相应的指针类型。的指针类型。*放在指针定义中时,被
6、称为放在指针定义中时,被称为指针定义符指针定义符。放在可执行语句中的指针前被称为放在可执行语句中的指针前被称为指针运算指针运算符符,也称为,也称为“间接访问间接访问”运算符。运算符。2023/4/106指针变量的声明语句,由数据类型后跟星号,指针变量的声明语句,由数据类型后跟星号,再跟随指针变量名组成。再跟随指针变量名组成。数据类型数据类型 *指针变量名;指针变量名;如如:intint*iptriptr;intint *iptriptr;intint*iptriptr;intint*iptriptr;在指针定义中,一个在指针定义中,一个*只能表示一个指针。只能表示一个指针。intint*ipt
7、r1,iptr2;*iptr1,iptr2;/iptr1/iptr1指针变量,指针变量,iptr2iptr2整型变量整型变量intint*iptr1,*iptr2;*iptr1,*iptr2;/两个指针变量两个指针变量2023/4/107地址和指针的关系地址和指针的关系intint x x,*ptrptr;x=3x=3;ptrptr=&x;=&x;如果如果ptrptr指向指向x x,那么,那么*ptrptr 的值为的值为x x的值,以的值,以后对后对*ptrptr的赋值等价于对的赋值等价于对x x的赋值。的赋值。#include#include using namespace std;usin
8、g namespace std;void main()void main()intint x=3,*x=3,*ptrptr;ptrptr=&x;=&x;*ptrptr=11;=11;coutcoutxxendlendl;/x=11/x=11 2023/4/108二、二、指针变量的赋值指针变量的赋值与变量定义一样,定义好指针变量后也可以与变量定义一样,定义好指针变量后也可以对它进行初始化,指针变量可以初始化为对它进行初始化,指针变量可以初始化为0、NULL或一个地址。数值为或一个地址。数值为0或者或者NULL的指针不的指针不指任何内容。数值指任何内容。数值0是可以直接赋给指针变量的是可以直接赋给
9、指针变量的唯一整数值。唯一整数值。1.1.在定义指针变量的同时进行初始化赋值,一般在定义指针变量的同时进行初始化赋值,一般格式如下:格式如下:数据类型数据类型 *指针名初始地址;指针名初始地址;2023/4/1092.2.定义指针变量后,用赋值语句将其初始化。定义指针变量后,用赋值语句将其初始化。指针变量名指针变量名=地址;地址;可以是变量的地址、数组名、函数名等。可以是变量的地址、数组名、函数名等。用变量地址作为初值时,该变量的定义必须用变量地址作为初值时,该变量的定义必须在指针初始化之前定义。在指针初始化之前定义。不能把常量或表达式的地址赋给指针变量。不能把常量或表达式的地址赋给指针变量。
10、不能将一个非不能将一个非0 0整数直接赋给指针变量,但可整数直接赋给指针变量,但可以赋整数值以赋整数值0 0,表示该指针为空指针。,表示该指针为空指针。例如:例如:intint*p;p=0;*p;p=0;p p为空指针,不指向任何地址。为空指针,不指向任何地址。2023/4/10103.3.允许声明指向允许声明指向 void void 类型的指针,该指针可以类型的指针,该指针可以被赋予任何类型对象的地址。被赋予任何类型对象的地址。例如:例如:void*general;void*general;intint*point;*point;intint i;i;general=&i;general=&
11、i;point=(point=(intint*)general;*)general;2023/4/1011例例5.25.2、阅读如下程序:、阅读如下程序:源程序清单:源程序清单:#include#include using namespace std;using namespace std;void main()void main()intint x;x;intint*p;*p;intint*q;*q;intint a=3;a=3;intint*pa=&a;*pa=&a;p=&x;p=&x;q=p;q=p;coutcout*pa*paendlendl;2023/4/1012#include#i
12、nclude using namespace std;using namespace std;void main()void main()intint x=3,*x=3,*ptrptr=&x;=&x;*ptrptr=52;=52;coutcoutxxendlendl;/52/52coutcout*ptrptrendl;/52endl;/52coutcoutptrptrendlendl;/变量变量x x的地址的地址coutcout&x&xendlendl;/变量变量x x的地址的地址 2023/4/1013三、三、指针变量的使用指针变量的使用例例5.35.3、阅读如下程序:、阅读如下程序:源程序
13、清单:源程序清单:#include#include using namespace std;using namespace std;void main()void main()intint x,*p;x,*p;p=&x;p=&x;cincin*p;*p;coutcout*p*pendlendl;2023/4/1014指针在使用前要进行初始化或赋值,指针未指针在使用前要进行初始化或赋值,指针未赋值将非常危险。赋值将非常危险。#include#include using namespace std;using namespace std;void main()void main()intint x
14、=26 x=26;intint*ptrptr;*ptrptr=58;=58;/此时此时ptrptr是一个随机地址是一个随机地址coutcoutxxendlendl;很可能已经破坏了另一变量的值,甚至修改很可能已经破坏了另一变量的值,甚至修改了函数的返回地址等。了函数的返回地址等。2023/4/10155.3、简单变量与指针、简单变量与指针指针的类型是它所指向变量的类型。指针值不是指针的类型是它所指向变量的类型。指针值不是整型数,在使用中必须类型匹配。如:整型数,在使用中必须类型匹配。如:intint x=26 x=26;intint*ptrptr=&x;=&x;/定义指针变量定义指针变量*pt
15、rptr=&x;=&x;/error:/error:不能将整型地址转换成整型数不能将整型地址转换成整型数*ptrptr=50;=50;/执行语句:执行语句:*在此处作间接引用在此处作间接引用可以对不同的类型作强制转换,如:可以对不同的类型作强制转换,如:*ptrptr=(=(int)&xint)&x;表示将变量表示将变量x x的地址值作为一个整型数赋给变的地址值作为一个整型数赋给变量量*ptrptr,即变量,即变量x x。2023/4/1016因为指针是有类型的,所以给指针赋值不但因为指针是有类型的,所以给指针赋值不但要是一个地址,而且应该是一个与该指针类型相要是一个地址,而且应该是一个与该指
16、针类型相符的变量的地址。或者说指针的类型是它所指向符的变量的地址。或者说指针的类型是它所指向变量的类型。变量的类型。float f=34.5,float f=34.5,*fptrfptr=&f;=&f;/浮点指针浮点指针intint*iptriptr=&f;=&f;/error:/error:浮点变量地址赋给整浮点变量地址赋给整型指针型指针iptriptr=fptrfptr;/error:/error:浮点指针赋给整型指针浮点指针赋给整型指针将一个指针赋值给另一个指针,结果是两个将一个指针赋值给另一个指针,结果是两个指针指向一个相指针指向一个相 同的地址单元。同的地址单元。2023/4/101
17、7例例5.45.4、阅读如下程序:、阅读如下程序:源程序清单:源程序清单:#include#include using namespace std;using namespace std;void main()void main()intint x,*p;x,*p;x=3;x=3;p=&x;p=&x;*p=*p+10;*p=*p+10;coutcout*p*pendlendl;2023/4/1018例例5.55.5、输入、输入a a和和b b两个整数,运用指针技术按先两个整数,运用指针技术按先大后小的顺序输出大后小的顺序输出a a和和b b。源程序清单:源程序清单:#include#inclu
18、de#include#include using namespace std;using namespace std;void void main(voidmain(void)/利用间接访问方式来操作利用间接访问方式来操作 2023/4/1019intint a,ba,b;intint*p1=&a;*p1=&a;intint*p2=&b;*p2=&b;coutcoutinput a and b:input a and b:*p1*p2;*p1*p2;if(*p1*p2)if(*p1*p2)coutcout按按先先大大后后小小的的顺顺序序输输出出的的a a和和b b为为:*p2setw(4)*p
19、1:*p2setw(4)*p1endlendl;else else coutcout按按先先大大后后小小的的顺顺序序输输出出的的a a和和b b为为:*p1setw(4)*p2:*p1setw(4)*p2endlendl;2023/4/1020指针变量的运算指针变量的运算指针的算术运算指针的算术运算指针加一,减一运算指针加一,减一运算是指向下一个或前一个数据。是指向下一个或前一个数据。如:如:y=*y=*pxpx+相当于相当于y=*(y=*(pxpx+)/+)/pxpx为一指针为一指针指针与整数的加减运算指针与整数的加减运算指针指针 p p 加上或减去加上或减去 n n,其意义是指针当前指,其
20、意义是指针当前指向位置的前方或后方第向位置的前方或后方第 n n 个数据的地址。个数据的地址。这种运算的结果值取决于指针指向的数据类型。这种运算的结果值取决于指针指向的数据类型。2023/4/1021pa-2pa-1pa+1pa+2pa+3*(pa-2)*pa*(pa+1)*(pa+2)*(pa+3)*(pa-1)short*pa2023/4/1022pb-1pbpb+1pb+2*(pb-1)*pb*(pb+1)*(pb+2)int *pb2023/4/1023#include#include using namespace std;using namespace std;void main(
21、)void main()intint n=20,*n=20,*ptrptr=&n,*ptr1,y;=&n,*ptr1,y;y=*y=*ptrptr;coutcoutptrptr=ptrptrty=yty=yendlendl;y=*(y=*(ptrptr+);+);/y=*(+/y=*(+ptrptr););coutcoutptrptr=ptrptrty=yty=yendlendl;ptr1=ptr+3;ptr1=ptr+3;y=*ptr1;y=*ptr1;coutcoutptrptr=ptr1ty=y=ptr1ty=yendlendl;2023/4/1024关系运算关系运算表示所指变量在内存中
22、的位置关系表示所指变量在内存中的位置关系如:两个指针变量指向同一个数组中的元素如:两个指针变量指向同一个数组中的元素时,其关系运算的结果表明了这两个指针变量所时,其关系运算的结果表明了这两个指针变量所指向的数组元素的先后关系指向的数组元素的先后关系char a10;char*p1,*p2;p1=a+2;p2=a+4;p1+;p2-;指针可以和零之间进行等于或不等于的关系运算。指针可以和零之间进行等于或不等于的关系运算。例如:例如:p=0;p=0;/表示空指针表示空指针 2023/4/1025例例5.55.5、编写一交换两个整型变量值的函数,并、编写一交换两个整型变量值的函数,并写一主函数测试。
23、写一主函数测试。#include#include using namespace std;using namespace std;void void swap(intswap(int*x,intx,int*y)*y)intint t;t;t=*x,*x=*y,*y=t;t=*x,*x=*y,*y=t;void main()void main()intint a=1,b=2;a=1,b=2;coutcout交换前交换前:a=a,b=b:a=a,b=bendlendl;swap(&a,&bswap(&a,&b););coutcout交换后交换后:a=a,b=b:a=a,b=bendlendl;20
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 精品 C+ 课件 第五
限制150内