c语言指针(总结)课件.ppt
- 【下载声明】
1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
3. 本页资料《c语言指针(总结)课件.ppt》由用户(ziliao2023)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言 指针 总结 课件
- 资源描述:
-
1、第第11章章 指针指针C程序设计快速进阶大学教程程序设计快速进阶大学教程C程序设计快速进阶大学教程2023-5-292第第11章章 指针指针本章要点本章要点 指针概念指针概念 指针与数组指针与数组 指针与函数指针与函数 字符串字符串 动态空间管理动态空间管理C程序设计快速进阶大学教程2023-5-29311 指针指针知识点知识点 指针概念指针概念 指向数组的指针、指针数组指向数组的指针、指针数组 指针做参数、指针做为函数值、指向函数的指针指针做参数、指针做为函数值、指向函数的指针 字符串字符串 动态空间管理动态空间管理C程序设计快速进阶大学教程2023-5-29411.1 理解指针理解指针当问
2、路时,经常听到这样的回答:当问路时,经常听到这样的回答:“向前走过向前走过3个个路口右转,再过两个路口左转,再前行路口右转,再过两个路口左转,再前行200米。米。”当在图书馆中找一本时,经常是这样找:当在图书馆中找一本时,经常是这样找:“第五排第五排书架,从上向下数第二层,左数第书架,从上向下数第二层,左数第6本。本。”老师提问学生,在不知道学生姓名的情况下,经常老师提问学生,在不知道学生姓名的情况下,经常说:说:“第第4排左数第二个同学。排左数第二个同学。”上述例子说明对一个事务的访问,当不能够通过名上述例子说明对一个事务的访问,当不能够通过名称直接访问,只能够通过其位置进行访问。称直接访问
3、,只能够通过其位置进行访问。C程序同样的道理,前面的章节对数据的访问是通程序同样的道理,前面的章节对数据的访问是通过变量名称实现的,但是,有时候不知道其名称,过变量名称实现的,但是,有时候不知道其名称,甚至其没有名称,这时候只能通过该数据所在的地甚至其没有名称,这时候只能通过该数据所在的地址进行访问。址进行访问。C程序设计快速进阶大学教程2023-5-29511.2 指向变量的指针指向变量的指针C语言中定义一个变量时,例如:语言中定义一个变量时,例如:int i1=3;描述了变量相关的描述了变量相关的3方面的属性:方面的属性:值、地值、地址、类型址、类型。1.值为值为3,通过变量访问,如,通过
4、变量访问,如i1+52.地址为地址为0012ff78(32位机器,位机器,0012ff78为为16进制数),进制数),占用内存空间的位置,通过占用内存空间的位置,通过&i1访问,访问,&在在scanf语句中语句中使用过。使用过。3.类型为类型为int,决定了其能够参加的运算,同时也决定了其,决定了其能够参加的运算,同时也决定了其占用空间的大小(从起始地址开始占用的连续字节数),占用空间的大小(从起始地址开始占用的连续字节数),占用空间的大小通过占用空间的大小通过sizeof运算符,在运算符,在vc中中sizeof(i1)为为4个字节。个字节。C程序设计快速进阶大学教程2023-5-29611.
5、2 指向变量的指针指向变量的指针把变量把变量i1的地址存放于指针变量的地址存放于指针变量pi1中中 C程序设计快速进阶大学教程2023-5-29711.2.1 指针变量的定义指针变量的定义指针变量定义的一般形式为:指针变量定义的一般形式为:类型说明符类型说明符 *变量名变量名;例如:例如:int*pi1;对指针变量的定义包括三个内容:对指针变量的定义包括三个内容:1.指针类型说明,指针类型说明,*表示这是一个指针变量;表示这是一个指针变量;2.指针变量名,指针变量名,pi1为指针变量名;为指针变量名;3.指针所指向的变量的数据类型,指针所指向的变量的数据类型,int为指针变量所指向的为指针变量
6、所指向的变量的数据类型,说明变量的数据类型,说明pi1只能储存整型变量的地址。只能储存整型变量的地址。再如:再如:float*pf1;/*pf1是指向浮点变量的指针变量是指向浮点变量的指针变量*/char*pc1 /*pc1是指向字符变量的指针变量是指向字符变量的指针变量*/C程序设计快速进阶大学教程2023-5-29811.2.2 指针变量的引用指针变量的引用 指针变量同普通变量一样,使用之前不仅要指针变量同普通变量一样,使用之前不仅要定义说明,而且必须赋予具体的值。定义说明,而且必须赋予具体的值。未经赋值的指针变量不能使用,否则将造成系未经赋值的指针变量不能使用,否则将造成系统混乱,甚至死
7、机。(统混乱,甚至死机。(问路时别人告诉你一个不问路时别人告诉你一个不存在的地址,会怎么样?存在的地址,会怎么样?)C程序设计快速进阶大学教程2023-5-29911.2.2 指针变量的引用指针变量的引用 和指针相关有两个运算符和指针相关有两个运算符&和和*:1.&:取地址运算符。:取地址运算符。其一般形式为:其一般形式为:&变量名变量名 取一个内存变量的地址。取一个内存变量的地址。2.*:指针运算符(或称:指针运算符(或称“间接访问间接访问”运算符)。运算符)。其一般形式为:其一般形式为:*指针变量名指针变量名通过指针变量间接访问指针变量所指向变量的数据。通过指针变量间接访问指针变量所指向变
8、量的数据。int i1;int *pi1;pi1=&i1;int i2=*pi1+1;此处此处*代表间接访问运算符,取指针变量代表间接访问运算符,取指针变量pi1所指向的变量所指向的变量i1的值(对的值(对i1间接访问)加间接访问)加1赋值给变量赋值给变量i2。此语句结果完。此语句结果完全等价于:全等价于:int i2=i1+1;C程序设计快速进阶大学教程2023-5-291011.2.2 指针变量的引用指针变量的引用指针变量说明:指针变量说明:1.对对*要区别类型说明符与间接访问符。要区别类型说明符与间接访问符。2.不能用一个数给指针变量赋值,下面赋值是错误的:不能用一个数给指针变量赋值,下
9、面赋值是错误的:int*pi1;pi1=20;但是,指针可用但是,指针可用0赋值,代表空指针,哪里也不指向。赋值,代表空指针,哪里也不指向。3.给指针变量赋值时,指针变量前不能加给指针变量赋值时,指针变量前不能加“*”说明符,下面的说明符,下面的写法是错误的:写法是错误的:int i1;int*pi1;*pi1=&i1;指针变量指针变量pi1前面加前面加*就代表间接访问了,代表就代表间接访问了,代表i1。C程序设计快速进阶大学教程2023-5-291111.2.2 指针变量的引用指针变量的引用指针变量说明:指针变量说明:4.指针变量未指向具体有效地址,间接访问会有问题指针变量未指向具体有效地址
10、,间接访问会有问题 int*pi1;/*指针变量指针变量pi1未赋值,不知道指向哪里未赋值,不知道指向哪里*/*pi1=200;/*向向pi1所指向的地址空间赋值所指向的地址空间赋值200*/(随机给你一个账户,存钱后怎样取呢?随机给你一个账户,存钱后怎样取呢?)判定一个指针变量是否指向有效空间:判定一个指针变量是否指向有效空间:int*pi1=0;if(pi1!=0)*pi1=200;省略号部分,若未使省略号部分,若未使pi1指向有效空间,这对指向有效空间,这对*pil的赋值就不会的赋值就不会执行。执行。C程序设计快速进阶大学教程2023-5-291211.2.2 指针变量的引用指针变量的引
11、用指针变量说明:指针变量说明:5.指针变量的值是可以改变的指针变量的值是可以改变的int i1=3,i2=4,*pi1;pi1=&i1;i2=i2+*pi1;C程序设计快速进阶大学教程2023-5-291311.2.2 指针变量的引用指针变量的引用指针变量说明:指针变量说明:5.指针变量的值是可以改变的指针变量的值是可以改变的pi1=&i2;改变指针变量改变指针变量pi1指向指向i2 C程序设计快速进阶大学教程2023-5-291411.2.2 指针变量的引用指针变量的引用指针变量说明:指针变量说明:5.指针变量只能用同类型的地址赋值指针变量只能用同类型的地址赋值float*pf1;/*pf1
12、是指向浮点变量的指针变量是指向浮点变量的指针变量*/char c1;/*字符变量字符变量*/pf1=&c1;pf1只能存储只能存储float数据的地址,用字符型数据地址赋值是错误数据的地址,用字符型数据地址赋值是错误的。的。C程序设计快速进阶大学教程2023-5-291511.2.2 指针变量的引用指针变量的引用指针变量说明:指针变量说明:7.同类型指针变量间可以相互赋值同类型指针变量间可以相互赋值例例11.1 交换指针变量交换指针变量#include int main()int i1=3,i2=4;int*pi1,*pi2,*pi3;pi1=&i1;pi2=&i2;pi3=0;/*交换指针变
13、量交换指针变量*/pi3=pi1;pi1=pi2;pi2=pi3;printf(i1=%dni2=%dn,i1,i2);printf(*pi1=%dn*pi2=%dn,*pi1,*pi2);return 0;程序运行结果:程序运行结果:i1=3i2=4*pi1=4*pi2=3C程序设计快速进阶大学教程2023-5-291611.2.2 指针变量的引用指针变量的引用指针变量说明:指针变量说明:7.同类型指针变量间可以相互赋值同类型指针变量间可以相互赋值例例11.1 交换指针变量交换指针变量C程序设计快速进阶大学教程2023-5-291711.2.2 指针变量的引用指针变量的引用指针变量说明:指针
14、变量说明:7.同类型指针变量间可以相互赋值同类型指针变量间可以相互赋值例例11.2 交换指针变量所指向的数据交换指针变量所指向的数据#include int main()int i1=3,i2=4;int*pi1,*pi2;int iTemp=0;pi1=&i1;pi2=&i2;/*交换指针变量所指向的数据交换指针变量所指向的数据*/iTemp=*pi1;*pi1=*pi2;*pi2=iTemp;printf(i1=%dni2=%dn,i1,i2);printf(*pi1=%dn*pi2=%dn,*pi1,*pi2);return 0;程序运行结果:程序运行结果:i1=4i2=3*pi1=4*
15、pi2=3C程序设计快速进阶大学教程2023-5-291811.2.2 指针变量的引用指针变量的引用指针变量说明:指针变量说明:7.同类型指针变量间可以相互赋值同类型指针变量间可以相互赋值例例11.2 交换指针变量所指向的数据交换指针变量所指向的数据C程序设计快速进阶大学教程2023-5-291911.3 数组与指针数组与指针 一个变量有一个地址,一个数组包含若干元素,一个变量有一个地址,一个数组包含若干元素,每个数组元素都在内存中占用存储单元,它们都每个数组元素都在内存中占用存储单元,它们都有相应的地址。所谓数组的指针是指数组的起始有相应的地址。所谓数组的指针是指数组的起始地址,数组元素的指
16、针是数组元素的地址。地址,数组元素的指针是数组元素的地址。对数组元素也可以采用指针进行访问,效率相对数组元素也可以采用指针进行访问,效率相对更高。对更高。C程序设计快速进阶大学教程2023-5-292011.3.1 一维数组与指针一维数组与指针一个数组是由连续的一块内存单元组成的。一个数组是由连续的一块内存单元组成的。数组名就是这块连续内存单元的首地址(常量)。数组名就是这块连续内存单元的首地址(常量)。int iArr5=1,2,3,4,5;int*pi;pi=&iArr0;C程序设计快速进阶大学教程2023-5-292111.3.1 一维数组与指针一维数组与指针 C语言规定,数组名代表数组
17、的首地址,也语言规定,数组名代表数组的首地址,也就是第就是第0号元素的地址。因此,下面两个语句等价:号元素的地址。因此,下面两个语句等价:pi=&iArr0;pi=iArr;iArr数组名是整型数组名是整型常量地址常量地址 int i;iArr=&i;/*不可以,因为不可以,因为iArr为常量为常量*/C程序设计快速进阶大学教程2023-5-292211.3.1 一维数组与指针一维数组与指针1.指针相关的运算符指针相关的运算符(1)取地址运算符取地址运算符&:单目运算符:单目运算符(注意其优先级注意其优先级),其结合性为自右至左,其功能是取变量的地址。其结合性为自右至左,其功能是取变量的地址。
18、(2)间接访问运算符间接访问运算符*:单目运算符,其结合性为:单目运算符,其结合性为自右至左,用来表示指针变量所指的变量。自右至左,用来表示指针变量所指的变量。(3)赋值运算符赋值运算符=:可以给指针变量赋值。:可以给指针变量赋值。(4)算术运算符算术运算符+、-、+、-。+:地址表达式(:地址表达式(pi)+整型表达式(整型表达式(in),),结果为在结果为在pi地址值位置跳过地址值位置跳过in(pi所指类型字所指类型字节数)个字节后的地址。节数)个字节后的地址。C程序设计快速进阶大学教程2023-5-292311.3.1 一维数组与指针一维数组与指针1.指针相关的运算符指针相关的运算符-:
19、地址表达式(:地址表达式(pi)-整型表达式(整型表达式(in),结果为),结果为在在pi地址值位置跳回地址值位置跳回in(pi所指类型字节数)所指类型字节数)个字节后的地址。个字节后的地址。-:地址表达式(:地址表达式(pi1)-地址表达式(地址表达式(pi12),结果),结果为在为在pi2和和pi1相差的字节数相差的字节数(pi1所指类型字所指类型字节数)。节数)。pi1与与pi2必须指向相同数据类型。必须指向相同数据类型。+:地址变量(:地址变量(pi)+或者或者+地址变量(地址变量(pi),),结果为在结果为在pi地址值位置跳过地址值位置跳过pi所指类型字节数所指类型字节数个字节后的地
20、址。分前个字节后的地址。分前+和后和后+。-:地址变量(:地址变量(pi)-或者或者-地址变量(地址变量(pi),结果),结果为在为在pi地址值位置跳回地址值位置跳回pi所指类型字节数个字所指类型字节数个字节后的地址。分前节后的地址。分前-和后和后-。C程序设计快速进阶大学教程2023-5-292411.3.1 一维数组与指针一维数组与指针1.指针相关的运算符指针相关的运算符(5)关系运算。支持关系运算。支持6种关系运算符,用来比较地种关系运算符,用来比较地址的大小。例如:址的大小。例如:&iArr1&iArr3 为真;为真;piiArr+3为真(为真(pi的值为的值为iArr)。)。C程序设
21、计快速进阶大学教程2023-5-292511.3.1 一维数组与指针一维数组与指针1.指针相关的运算符指针相关的运算符(5)关系运算。关系运算。int iArr5=0,1,2,3,4;int*pi,*pi1,*pi2;pi=&iArr1;pi1=&iArr2;pi2=&iArr4;*pi+:由于:由于+和和*同优先级,结合方向自右而左,等价于同优先级,结合方向自右而左,等价于*(pi+)。先对。先对*pi,然后,然后pi加加1。表达式的值为。表达式的值为iArr1,pi的值为的值为&iArr2。*+pi:等价于:等价于*(+pi)。先。先pi加加1,然后,然后*pi。表达式的值为。表达式的值为
22、iArr2,pi的的值为值为&iArr2。(*pi)+:先:先*pi,然后(,然后(*pi)加)加1。表达式的值为。表达式的值为iArr1+,iArr1的值的值改变了,改变了,pi的值为的值为&iArr1,pi的值未改变。的值未改变。pi2-pi1:pi2和和pi1相差两个整型数所占字节数的大小,它的返回值不是相相差两个整型数所占字节数的大小,它的返回值不是相差字节数,而是相差整数的个数,所以值为差字节数,而是相差整数的个数,所以值为2。上述算术运算符对简单变量地址运算是无意义的,因为对于一个简单变量上述算术运算符对简单变量地址运算是无意义的,因为对于一个简单变量x,&x+5计算的结果地址不知
23、道是哪个数据的地址。而数组空间是连续计算的结果地址不知道是哪个数据的地址。而数组空间是连续的,对于一个数组的,对于一个数组arr,arr+5就是就是arr5的地址。的地址。C程序设计快速进阶大学教程2023-5-292611.3.1 一维数组与指针一维数组与指针1.指针相关的运算符指针相关的运算符(5)关系运算。关系运算。int iArr5=0,1,2,3,4;int*pi,*pi1,*pi2;pi=&iArr1;pi1=&iArr2;pi2=&iArr4;*pi+:由于:由于+和和*同优先级,结合方向自右而左,等价于同优先级,结合方向自右而左,等价于*(pi+)。先对。先对*pi,然后,然后
24、pi加加1。表达式的值为。表达式的值为iArr1,pi的值为的值为&iArr2。*+pi:等价于:等价于*(+pi)。先。先pi加加1,然后,然后*pi。表达式的值为。表达式的值为iArr2,pi的的值为值为&iArr2。(*pi)+:先:先*pi,然后(,然后(*pi)加)加1。表达式的值为。表达式的值为iArr1+,iArr1的值的值改变了,改变了,pi的值为的值为&iArr1,pi的值未改变。的值未改变。pi2-pi1:pi2和和pi1相差两个整型数所占字节数的大小,它的返回值不是相相差两个整型数所占字节数的大小,它的返回值不是相差字节数,而是相差整数的个数,所以值为差字节数,而是相差整
25、数的个数,所以值为2。上述算术运算符对简单变量地址运算是无意义的,因为对于一个简单变量上述算术运算符对简单变量地址运算是无意义的,因为对于一个简单变量x,&x+5计算的结果地址不知道是哪个数据的地址。而数组空间是连续计算的结果地址不知道是哪个数据的地址。而数组空间是连续的,对于一个数组的,对于一个数组arr,arr+5就是就是arr5的地址。的地址。C程序设计快速进阶大学教程2023-5-292711.3.1 一维数组与指针一维数组与指针2.引用数组元素引用数组元素 int iArr5=1,2,3,4,5;int*pi;pi=iArr;(1)pi+i1和和iArr+i1就是就是iArri1的地
展开阅读全文