C语言指针精品课件.ppt
《C语言指针精品课件.ppt》由会员分享,可在线阅读,更多相关《C语言指针精品课件.ppt(106页珍藏版)》请在三一办公上搜索。
1、第11章 指针,C程序设计快速进阶大学教程,C程序设计快速进阶大学教程,2023/7/5,2,第11章 指针,本章要点指针概念指针与数组指针与函数字符串动态空间管理,C程序设计快速进阶大学教程,2023/7/5,3,11 指针,知识点指针概念指向数组的指针、指针数组指针做参数、指针做为函数值、指向函数的指针字符串动态空间管理,C程序设计快速进阶大学教程,2023/7/5,4,11.1 理解指针,当问路时,经常听到这样的回答:“向前走过3个路口右转,再过两个路口左转,再前行200米。”当在图书馆中找一本时,经常是这样找:“第五排书架,从上向下数第二层,左数第6本。”老师提问学生,在不知道学生姓名
2、的情况下,经常说:“第4排左数第二个同学。”上述例子说明对一个事务的访问,当不能够通过名称直接访问,只能够通过其位置进行访问。C程序同样的道理,前面的章节对数据的访问是通过变量名称实现的,但是,有时候不知道其名称,甚至其没有名称,这时候只能通过该数据所在的地址进行访问。,C程序设计快速进阶大学教程,2023/7/5,5,11.2 指向变量的指针,C语言中定义一个变量时,例如:int i1=3;,描述了变量相关的3方面的属性:值、地址、类型。,1.值为3,通过变量访问,如i1+5,2.地址为0012ff78(32位机器,0012ff78为16进制数),占用内存空间的位置,通过&i1访问,&在sc
3、anf语句中使用过。,3.类型为int,决定了其能够参加的运算,同时也决定了其占用空间的大小(从起始地址开始占用的连续字节数),占用空间的大小通过sizeof运算符,在vc中sizeof(i1)为4个字节。,C程序设计快速进阶大学教程,2023/7/5,6,11.2 指向变量的指针,把变量i1的地址存放于指针变量pi1中,C程序设计快速进阶大学教程,2023/7/5,7,11.2.1 指针变量的定义,指针变量定义的一般形式为:类型说明符*变量名;例如:int*pi1;对指针变量的定义包括三个内容:1.指针类型说明,*表示这是一个指针变量;2.指针变量名,pi1为指针变量名;3.指针所指向的变量
4、的数据类型,int为指针变量所指向的变量的数据类型,说明pi1只能储存整型变量的地址。再如:float*pf1;/*pf1是指向浮点变量的指针变量*/char*pc1/*pc1是指向字符变量的指针变量*/,C程序设计快速进阶大学教程,2023/7/5,8,11.2.2 指针变量的引用,指针变量同普通变量一样,使用之前不仅要定义说明,而且必须赋予具体的值。未经赋值的指针变量不能使用,否则将造成系统混乱,甚至死机。(问路时别人告诉你一个不存在的地址,会怎么样?),C程序设计快速进阶大学教程,2023/7/5,9,11.2.2 指针变量的引用,和指针相关有两个运算符,C程序设计快速进阶大学教程,20
5、23/7/5,10,11.2.2 指针变量的引用,指针变量说明:1.对*要区别类型说明符与间接访访问符。2.不能用一个数给指针变量赋值,下面赋值是错误的:int*pi1;pi1=20;但是,指针可用0赋值,代表空指针,哪里也不指向。3.给指针变量赋值时,指针变量前不能加“*”说明符,下面的写法是错误的:int i1;int*pi1;*pi1=指针变量pi1前面加*就代表间接访问了,代表i1。,C程序设计快速进阶大学教程,2023/7/5,11,11.2.2 指针变量的引用,指针变量说明:4.指针变量未指向具体有效地址,间接访问会有问题 int*pi1;/*指针变量pi1未赋值,不知道指向哪里*
6、/*pi1=200;/*向pi1所指向的地址空间赋值200*/(随机给你一个账户,存钱后怎样取呢?)判定一个指针变量是否指向有效空间:int*pi1=0;if(pi1!=0)*pi1=200;省略号部分,若未使pi1指向有效空间,这对*pil的赋值就不会执行。,C程序设计快速进阶大学教程,2023/7/5,12,11.2.2 指针变量的引用,指针变量说明:5.指针变量的值是可以改变的int i1=3,i2=4,*pi1;pi1=,C程序设计快速进阶大学教程,2023/7/5,13,11.2.2 指针变量的引用,指针变量说明:5.指针变量的值是可以改变的pi1=改变指针变量pi1指向i2,C程序
7、设计快速进阶大学教程,2023/7/5,14,11.2.2 指针变量的引用,指针变量说明:6.指针变量只能用同类型的地址赋值float*pf1;/*pf1是指向浮点变量的指针变量*/char c1;/*字符变量*/pf1=pf1只能存储float数据的地址,用字符型数据地址赋值是错误的。,C程序设计快速进阶大学教程,2023/7/5,15,11.2.2 指针变量的引用,指针变量说明:7.同类型指针变量间可以相互赋值例11.1 交换指针变量#include int main()int i1=3,i2=4;int*pi1,*pi2,*pi3;pi1=,程序运行结果:i1=3i2=4*pi1=4*p
8、i2=3,C程序设计快速进阶大学教程,2023/7/5,16,11.2.2 指针变量的引用,指针变量说明:7.同类型指针变量间可以相互赋值例11.1 交换指针变量,C程序设计快速进阶大学教程,2023/7/5,17,11.2.2 指针变量的引用,指针变量说明:7.同类型指针变量间可以相互赋值例11.2 交换指针变量所指向的数据#include int main()int i1=3,i2=4;int*pi1,*pi2;int iTemp=0;pi1=,程序运行结果:i1=4i2=3*pi1=4*pi2=3,C程序设计快速进阶大学教程,2023/7/5,18,11.2.2 指针变量的引用,指针变量
9、说明:7.同类型指针变量间可以相互赋值例11.2 交换指针变量所指向的数据,C程序设计快速进阶大学教程,2023/7/5,19,课堂练习,1.指针变量存储的是什么?,C程序设计快速进阶大学教程,2023/7/5,20,11.3 数组与指针,一个变量有一个地址,一个数组包含若干元素,每个数组元素都在内存中占用存储单元,它们都有相应的地址。所谓数组的指针是指数组的起始地址,数组元素的指针是数组元素的地址。对数组元素也可以采用指针进行访问,效率相对更高。,C程序设计快速进阶大学教程,2023/7/5,21,11.3.1 一维数组与指针,一个数组是由连续的一块内存单元组成的。数组名就是这块连续内存单元
10、的首地址(常量)。int iArr5=1,2,3,4,5;int*pi;pi=,C程序设计快速进阶大学教程,2023/7/5,22,11.3.1 一维数组与指针,C语言规定,数组名代表数组的首地址,也就是第0号元素的地址。因此,下面两个语句等价:pi=/*不可以,因为iArr为常量*/,C程序设计快速进阶大学教程,2023/7/5,23,11.3.1 一维数组与指针,1.指针相关的运算符(1)取地址运算符&:单目运算符(注意其优先级),其结合性为自右至左,其功能是取变量的地址。(2)间接访问运算符*:单目运算符,其结合性为自右至左,用来表示指针变量所指的变量。(3)赋值运算符=:可以给指针变量
11、赋值。(4)算术运算符+、-、+、-。+:地址表达式(pi)+整型表达式(in),结果为在pi地址值位置跳过in(pi所指类型字节数)个字节后的地址。,C程序设计快速进阶大学教程,2023/7/5,24,11.3.1 一维数组与指针,1.指针相关的运算符-:地址表达式(pi)-整型表达式(in),结果为在pi地址值位置跳回in(pi所指类型字节数)个字节后的地址。-:地址表达式(pi1)-地址表达式(pi12),结果为在pi2和pi1相差的字节数(pi1所指类型字节数)。pi1与pi2必须指向相同数据类型。+:地址变量(pi)+或者+地址变量(pi),结果为在pi地址值位置跳过pi所指类型字节
12、数个字节后的地址。分前+和后+。-:地址变量(pi)-或者-地址变量(pi),结果为在pi地址值位置跳回pi所指类型字节数个字节后的地址。分前-和后-。,C程序设计快速进阶大学教程,2023/7/5,25,11.3.1 一维数组与指针,1.指针相关的运算符(5)关系运算。支持6种关系运算符,用来比较地址的大小。例如:&iArr1&iArr3 为真;piiArr+3为真(pi的值为iArr)。,C程序设计快速进阶大学教程,2023/7/5,26,11.3.1 一维数组与指针,1.指针相关的运算符(5)关系运算。int iArr5=0,1,2,3,4;int*pi,*pi1,*pi2;pi=*pi
13、+:由于+和*同优先级,结合方向自右而左,等价于*(pi+)。先对*pi,然后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相差两个整型数所占字节数的大小,它的返回值不是相差字节数,而是相差整数的个数,所以值为2。上述算术运算符对简单变量地址运算是无意义的,因为对于一个简单变量x,&x+5计算的结果地址不知道是哪个数据的地
14、址。而数组空间是连续的,对于一个数组arr,arr+5就是arr5的地址。,C程序设计快速进阶大学教程,2023/7/5,27,11.3.1 一维数组与指针,1.指针相关的运算符(5)关系运算。int iArr5=0,1,2,3,4;int*pi,*pi1,*pi2;pi=*pi+:由于+和*同优先级,结合方向自右而左,等价于*(pi+)。先对*pi,然后pi加1。表达式的值为iArr1,pi的值为&iArr2。*+pi:等价于*(+pi)。先pi加1,然后*pi。表达式的值为iArr2,pi的值为&iArr2。(*pi)+:先*pi,然后(*pi)加1。表达式的值为iArr1+,iArr1的
15、值改变了,pi的值为&iArr1,pi的值未改变。pi2-pi1:pi2和pi1相差两个整型数所占字节数的大小,它的返回值不是相差字节数,而是相差整数的个数,所以值为2。上述算术运算符对简单变量地址运算是无意义的,因为对于一个简单变量x,&x+5计算的结果地址不知道是哪个数据的地址。而数组空间是连续的,对于一个数组arr,arr+5就是arr5的地址。,C程序设计快速进阶大学教程,2023/7/5,28,11.3.1 一维数组与指针,2.引用数组元素 int iArr5=1,2,3,4,5;int*pi;pi=iArr;(1)pi+i1和iArr+i1就是iArri1的地址,或者说它们指向iA
16、rr数组的第i个元素。(2)*(pi+i1)或*(iArr+i1)就是pi+i1或iArr+i1所指向的数组元素,即iArr i1。例如,*(pi+2)或*(iArr+2)就是iArr2。(3)指向数组指针变量可以带下标,如pii1与*(pi+i1)等价。引入指针变量后,对于数组iArr,pi是指向数组的指针变量,其初值pi=iArr。就可以用两种方法来访问数组元素:(1)下标法,即用iArri1形式访问数组元素,也可以用pii1访问数组元素。(2)指针法,即采用*(iArr+i1)或*(pi+i1)形式,用间接访问的方法来访问数组元素。,C程序设计快速进阶大学教程,2023/7/5,29,1
17、1.3.1 一维数组与指针,例11.3 数组元素赋值并输出(数组名下标法)#include int main()int iArr5,i1;for(i1=0;i15;i1+)iArri1=i1;for(i1=0;i15;i1+)printf(iArr%d=%dn,i1,iArri1);return 0;,C程序设计快速进阶大学教程,2023/7/5,30,11.3.1 一维数组与指针,例11.4 数组元素赋值并输出(指针变量下标法)#include int main()int iArr5,i1;int*pi=iArr;/*pi为变量,iArr为常量*/for(i1=0;i15;i1+)pii1=
18、i1;for(i1=0;i15;i1+)printf(iArr%d=%dn,i1,pii1);return 0;,C程序设计快速进阶大学教程,2023/7/5,31,11.3.1 一维数组与指针,例11.5 数组元素赋值并输出(数组名指针法)#include int main()int iArr5,i1;for(i1=0;i15;i1+)*(iArr+i1)=i1;for(i1=0;i15;i1+)printf(iArr%d=%dn,i1,*(iArr+i1);return 0;,C程序设计快速进阶大学教程,2023/7/5,32,11.3.1 一维数组与指针,例11.6 数组元素赋值并输出(
19、指针变量指针法)#include int main()int iArr5,i1;int*pi=iArr;for(i1=0;i15;i1+)*(pi+i1)=i1;for(i1=0;i15;i1+)printf(iArr%d=%dn,i1,*(pi+i1);return 0;,C程序设计快速进阶大学教程,2023/7/5,33,11.3.1 一维数组与指针,例11.7 数组元素赋值并输出(指针变量指针移动法)#include int main()int iArr5,i1;int*pi=iArr;for(i1=0;i15;i1+)*pi=i1;pi+;/*此时,pi已经指向iArr4之后,输出数组
20、元素,pi重新指回数组头部*/pi=iArr;for(i1=0;i15;i1+)printf(iArr%d=%dn,i1,*pi);pi+;return 0;,C程序设计快速进阶大学教程,2023/7/5,34,11.3.1 一维数组与指针,例11.8 数组元素赋值并输出(指针变量关系运算指针法)#include int main()int iArr5,i1=0;int*pi=iArr;for(;piiArr+5;pi+,i1+)*pi=i1;/*此时,pi已经指向iArr4之后,为下面输出数组,必须让pi重新指回数组头部*/pi=iArr;i1=0;for(;piiArr+5;pi+,i1+
21、)printf(iArr%d=%dn,i1,*pi);return 0;,C程序设计快速进阶大学教程,2023/7/5,35,11.3.2 二维数组与指针,1.理解二维数组 C语言对二维数组的存储是行优先方式的,对于整型二维数组iArr。int iArr34=1,2,3,4,5,6,7,8,9,10,11,12,C程序设计快速进阶大学教程,2023/7/5,36,11.3.2 二维数组与指针,1.理解二维数组一个二维数组是以一维数组为元素构造的一维数组,也就是二维数组可以看作一维数组,只不过该一维数组的每个元素又是一个一维数组。如iArr,把iArr当作一维数组看待,iArr有3个元素,分别为
22、iArr0,iArr1,iArr2,每个元素是一个有4个整型元素构成的一维数组。,C程序设计快速进阶大学教程,2023/7/5,37,11.3.2 二维数组与指针,1.理解二维数组iArri1有两层含义,它既是“一维数组iArr”的数组元素,又是一维数组名。iArr1是数组iArr的一个数组元素;同时,iArr1是一个一维数组名,含有iArr10,iArr11,iArr12,iArr13四个元素。,C程序设计快速进阶大学教程,2023/7/5,38,11.3.2 二维数组与指针,1.理解二维数组(对比一维)对于一维数组:int iArr14=11,12,13,14;iArr1是一个其数组元素类
23、型的常量地址,即int型的常量地址,则iArr1+1的值会跳过一个数组元素,即跳过4个字节(假定一个int,4个字节)。对于当作一维数组的“iArr”,iArr是一个其数组元素类型的常量地址,它的数组元素为iArri1(iArri1为4个int类型的一维数组),所以iArr为大小为4的一维整型数组型的常量地址,则iArr+1的值会跳过一个数组元素,即跳过大小为4的一维整型数组(一行,16个字节,假定一个int为4个字节)。因此也把iArr称为行地址。,C程序设计快速进阶大学教程,2023/7/5,39,11.3.2 二维数组与指针,1.理解二维数组(对比一维)在一维数组中iArr1中,iArr
24、1i1等价于*(iArr1+i1),代表取出第i1个元素。在二维数组iArr中,iArri1也等价于*(iArr+i1),iArri1和*(iArr+i1)是一维数组的数组名和首地址。因为iArri1和*(iArr+i1)为一维数组,为整数类型常量地址,所以iArri1+1和*(iArr+i1)+1都会跳过一个整型数据(一列,4个字节,假定一个int为4个字节),因此,也把iArri1和*(iArr+i1)称为列地址。,C程序设计快速进阶大学教程,2023/7/5,40,11.3.2 二维数组与指针,1.理解二维数组(对比一维)行地址(一维数组地址),一次跳过一行,如iArr、iArr+i1、
25、&iArri1、&*(iArr+i1);列地址(数据元素),一次跳过一列,如*iArr、*(iArr+i1)、iArri1。,*(*(iArr+1)+2):iArr+1一行指针,*(iArr+1)一列指针,*(iArr+1)+2 一行二列地址,*(*(iArr+1)+2)一行二列地址间接访问到iArr12,值为7。,C程序设计快速进阶大学教程,2023/7/5,41,11.3.2 二维数组与指针,例11.9 行列地址#include int main()int iArr34=1,2,3,4,5,6,7,8,9,10,11,12;/*行地址*/printf(行地址n);printf(iArr=%
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言 指针 精品 课件
链接地址:https://www.31ppt.com/p-5426311.html