C语言指针精品课件.ppt

上传人:小飞机 文档编号:5426311 上传时间:2023-07-05 格式:PPT 页数:106 大小:1.48MB
返回 下载 相关 举报
C语言指针精品课件.ppt_第1页
第1页 / 共106页
C语言指针精品课件.ppt_第2页
第2页 / 共106页
C语言指针精品课件.ppt_第3页
第3页 / 共106页
C语言指针精品课件.ppt_第4页
第4页 / 共106页
C语言指针精品课件.ppt_第5页
第5页 / 共106页
点击查看更多>>
资源描述

《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=%

26、x,iArr);printf(iArr+1=%xn,iArr+1);printf(,程序运行结果:行地址iArr=12ff50,iArr+1=12ff60&iArr0=12ff50,&iArr0+1=12ff60&*(iArr+0)=12ff50,&*(iArr+0)+1=12ff60列地址*iArr=12ff50,*iArr+1=12ff54iArr0=12ff50,iArr0+1=12ff54*(iArr+0)=12ff50,*(iArr+0)+1=12ff54数据元素iArr12=7,/*访问元素*/printf(数据元素n);printf(iArr12=%dn,*(*(iArr+1)+

27、2);return 0;,C程序设计快速进阶大学教程,2023/7/5,42,11.3.2 二维数组与指针,2.指向一维数组的指针 对于一维数组int iArr14;可以把iArr赋值给指向int型的指针变量。如:int*pi1;pi1=iArr1;对于二维数组int iArr34=1,2,3,4,5,6,7,8,9,10,11,12;同样可以把iArr赋值给指向一维数组的指针变量,因为二维数组的可以看成以一维数组为成员的一维数组。int(*pia)4;它表示pia是一个指针变量,它指向包含4个元素的一维数组。然后就可以赋值:pia=iArr;,C程序设计快速进阶大学教程,2023/7/5,4

28、3,11.3.2 二维数组与指针,2.指向一维数组的指针 pia指向第一个一维数组iArr0,其值等于iArr。而pia+1则指向一维数组iArr1。从前面的行列地址分析可得出*(pia+iRow)+iCol是二维数组iRow行iCol 列的元素的地址,而*(*(pia+iRow)+iCol)则是iRow行iCol列元素的值。,C程序设计快速进阶大学教程,2023/7/5,44,11.3.2 二维数组与指针,2.指向一维数组的指针 指向一维数组的指针变量定义的一般形式为:类型说明符(*指针变量名)数组长度;其中“类型说明符”为所指数组的数组元素类型,“*”表示其后的变量是指针类型,“数组长度”

29、表示所指向一维数组的长度。应注意“(*指针变量名)”两边的括号不可少,如缺少括号则表示是指针数组(后面介绍),意义就完全不同了。可以这样理解:先看小括号内,有*号是在定义指针变量;然后是中括号,表示指针变量指向该长度的一维数组;最后看类型说明符,表示该数组的每个元素为类型说明符说明的类型。,C程序设计快速进阶大学教程,2023/7/5,45,11.3.2 二维数组与指针,例11.10 一个学习小组有5个人,每个人有3门课的考试成绩。要求利用函数计算每门课程的平均成绩如:赵钱 孙李张Math 80 61598576C 7565638777English 9271709085问题分析:可定义一个二

30、维数组score35存储五个人3门课的成绩。再定义一个一维数组courseAverage3存储计算所得各门课平均成绩。要完成的要接收一门课程(数组的一行)为参数,所以应该设指向一维数组的指针为参数。算法描述:1.依次输入每门课程的成绩(每门课一行)。2.计算每门课程平均成绩,即对每行计算平均成绩(函数完成)。3.输出每门课程平均成绩。,C程序设计快速进阶大学教程,2023/7/5,46,11.3.2 二维数组与指针,#include int main()int i,j;float sum;float score35;/*存储成绩*/float courseAverage3;/*存储每门课程平均

31、成绩*/float average(float(*p)5);/*输入成绩*/for(i=0;i3;i+)/*行(每门课)循环*/for(j=0;j5;j+)/*行内每列循环*/scanf(%f,/*计算平均成绩,参数为行地址(指向一维数组指针)*/float average(float(*p)5)int i;float sum=0;for(i=0;i5;i+)/*p转为列地址,(*p+i)偏移i,间接访问*(*p+i)*/sum+=*(*p+i);return sum/5;,C程序设计快速进阶大学教程,2023/7/5,47,11.3.3 指针数组,一个数组的元素值为指针,则该数组称为指针数组

32、。指针数组所有元素都必须是指向相同数据类型的指针。指针数组定义的一般形式为:类型说明符*数组名数组长度;可以这样理解:先看“数组名数组长度”,表示定义一个该长度的一维数组;然后看“类型说明符*”,表示该数组的每个元素为指向该类型说明符类型的指针。例如:int*pa3;表示pa是一个指针数组,它有三个数组元素,每个元素值都是一个指针,指向整型变量。,C程序设计快速进阶大学教程,2023/7/5,48,11.3.3 指针数组,例11.11 通过指针数组访问二维数组#include int main()int iArr34=1,2,3,4,5,6,7,8,9,10,11,12;int*pa3;/*指

33、针数组,每个成员都是指向int型的指针*/int iRow;pa0=iArr0;/*iArr0为一维数组名,为int型地址*/pa1=iArr1;pa2=iArr2;for(iRow=0;iRow3;iRow+)printf(%d,%d,%d,%dn,*paiRow,*(paiRow+1),*(paiRow+2),*(paiRow+3);return 0;,程序运行结果:1,2,3,45,67,89,10,11,12,C程序设计快速进阶大学教程,2023/7/5,49,11.3.3 指针数组,例11.11 通过指针数组访问二维数组,C程序设计快速进阶大学教程,2023/7/5,50,11.3.

34、4 指向指针的指针,对一维数组int iArr15;数组成员类型是int,一维数组名iArr1是指向int的指针常量,是指向其成员类型的指针常量。对于指针数组int*pa3;数组成员类型是int*,一维数组名pa是指向int*的指针常量,同样是指向其成员类型(指向整形的指针)的指针常量,也就是说pa是指向指向整型指针的指针。,C程序设计快速进阶大学教程,2023/7/5,51,11.3.4 指向指针的指针,指向指针的指针定义的一般形式为:类型说明符*变量名;可以这样理解:先看“*变量名”,表示定义一个指针变量;然后看“类型说明符*”,表示该指针变量为指向“类型说明符*”类型的指针。char c

35、1=A;char*pc;char*ppc;pc=,c1、*pc、*ppc的值都为A;分别为直接访问、间接访问、二级间接访问,C程序设计快速进阶大学教程,2023/7/5,52,11.3.4 指向指针的指针,例11.12 不移动数据,通过改变指针使得追加数据有序#include int main()int iArr5=1,5,7,9;int*pa5=,/*-追加一个数据,原来数据不动,调整指针数组,通过指针数组访问仍然有序-*/iArr4=3;pa1=,程序运行结果:输出原来4个有序数据1579输出追加1个之后的5个有序数据13579,C程序设计快速进阶大学教程,2023/7/5,53,11.3

36、.4 指向指针的指针,课堂练习,1.指针类型作用?2指针与下标?3.不用指针可以吗?4.用指针方法实现一个一维数组的转置。,C程序设计快速进阶大学教程,2023/7/5,54,C程序设计快速进阶大学教程,2023/7/5,55,11.4.1 指针作函数参数,例11.13 交换变量数据交换形参指针变量#include void swap(int*pi1Copy,int*pi2Copy)int*piTemp;piTemp=pi1Copy;pi1Copy=pi2Copy;pi2Copy=piTemp;,int main()int i1=3,i2=4;int*pi1,*pi2;pi1=,C程序设计快速

37、进阶大学教程,2023/7/5,56,11.4.1 指针作函数参数,例11.13 交换变量数据交换形参指针变量,C程序设计快速进阶大学教程,2023/7/5,57,11.4.1 指针作函数参数,例11.14 交换形参指针变量所指向的变量#include void swap(int*pi1Copy,int*pi2Copy)int iTemp=0;/*交换形参指针变量所指向的变量,实参不受影响,但是实参所指向 数据改变了*/iTemp=*pi1Copy;/*用的间接访问,实际上是访问i1、i2*/*pi1Copy=*pi2Copy;*pi2Copy=iTemp;,int main()int i1=

38、3,i2=4;int*pi1,*pi2;pi1=,C程序设计快速进阶大学教程,2023/7/5,58,11.4.1 指针作函数参数,例11.14 交换形参指针变量所指向的变量,C程序设计快速进阶大学教程,2023/7/5,59,11.4.1 指针作函数参数,例11.14 交换形参指针变量所指向的变量若把swap函数改成下面的写法:void swap(int*pi1Copy,int*pi2Copy)int*ipTemp;*ipTemp=*pi1Copy;/*ipTemp指向哪里?*/*pi1Copy=*pi2Copy;*pi2Copy=*ipTemp;,C程序设计快速进阶大学教程,2023/7/

39、5,60,11.4.2 指针作函数参数,例11.16 对数组中的每个元素加1#include int main()int iArr13=2,5,3,iJ;void add(int iArr23);/*输出数组*/for(iJ=0;iJ=2;iJ+)printf(%d,iArr1iJ);printf(n);add(iArr1);/*数组名作为实参,注意,只有数组名,没有下标*/*函数调用后,输出数组*/for(iJ=0;iJ=2;iJ+)printf(%d,iArr1iJ);printf(n);return 0;,void add(int iArr23)int iI;for(iI=0;iI=2;

40、iI+)iArr2iI+;,C程序设计快速进阶大学教程,2023/7/5,61,11.4.2 数组名作函数参数,指针变量地址,所以实参数组与形参数组可以用指针变量取代pi=iArr1;add(pi);/*指针变量作为实参*/void add(int*iArr2)/*指针变量作形参*/还可以实参用数组名,形参用变量名,如:add(iArr1);/*数组名作为实参*/void add(int*iArr2)/*指针变量作形参*/也可以用指针变量作实参,数组名作为形参,如:pi=iArr1;add(pi);/*指针变量作为实参*/void add(int iArr23)/*数组名作为形参*/,C程序设

41、计快速进阶大学教程,2023/7/5,62,11.4.2 数组名作函数参数,归纳起来,如果有一个实参数组,想在函数中改变此数组的元素的值,实参与形参的对应关系有以下种:(1)形参和实参都是数组名。(2)实参用数组,形参用指针变量。(3)实参、形参都用指针变量。(4)实参为指针变量,形参为数组名。,通常情况下,为了能够让函数处理不同长度的数组,可以在参数中增加一处理数据长度的形参变量。还有函数的返回值只有一个,若需要函数返回多个同类型结果数据,也可以利用数组作函数参数,见例11.20。,C程序设计快速进阶大学教程,2023/7/5,63,11.4.2 数组名作函数参数,归纳起来,如果有一个实参数

42、组,想在函数中改变此数组的元素的值,实参与形参的对应关系有以下种:(1)形参和实参都是数组名。(2)实参用数组,形参用指针变量。(3)实参、形参都用指针变量。(4)实参为指针变量,形参为数组名。,通常情况下,为了能够让函数处理不同长度的数组,可以在参数中增加一处理数据长度的形参变量。还有函数的返回值只有一个,若需要函数返回多个同类型结果数据,也可以利用数组作函数参数,见例11.20。,C程序设计快速进阶大学教程,2023/7/5,64,11.4.2 指针作函数参数,例11.20 把给定整数数组中能被3整除的数据挑出来#include int select(int*piSourceCopy,in

43、t iN,int*piTargetCopy)int i1,iNum=0;for(i1=0;i1iN;i1+)if(piSourceCopyi1%3=0)piTargetCopyiNum+=piSourceCopyi1;return iNum;int main()int iArrSource10=5,15,25,36,47,58,69,78,56,90;int iArrTarget10;/*存放结果*/int i1,iNum=0;iNum=select(iArrSource,10,iArrTarget);for(i1=0;i1iNum;i1+)printf(%d,iArrTargeti1);re

44、turn 0;,C程序设计快速进阶大学教程,2023/7/5,65,11.4.3 返回指针值的函数,在语言中允许一个函数的返回值是一个指针(即地址),这种返回指针值的函数称为指针型函数。定义指针型函数的一般形式为:类型说明符*函数名(形参表)/*函数体*/把“类型说明符*”放在一起理解,则表示函数的返回值为指向“类型说明符”类型的指针。例如:int*f(int x,int y)./*函数体*/表示f是一个返回指针值的函数,它返回指向一个整型变量的指针。,C程序设计快速进阶大学教程,2023/7/5,66,11.4.3 返回指针值的函数,例11.18 在给定整数数组中选出最大整数并返回其地址#i

45、nclude int*max(int*piSourceCopy,int iN)/*返回指针*/int i1;int*pi1=,C程序设计快速进阶大学教程,2023/7/5,67,11.4.3 返回指针值的函数,例11.19指向已经释放数据空间#include char*lost()char c1=A;return,C程序设计快速进阶大学教程,2023/7/5,68,11.4.4 指向函数的指针,在语言中,一个函数总是占用一段连续的内存区,而函数名就是该函数所占内存区的首地址。我们可以把函数的这个首地址(或称入口地址)赋予一个指针变量,使该指针变量指向该函数。然后通过指针变量就可以找到并调用这个

46、函数。我们把这种指向函数的指针变量称为“函数指针变量”。函数指针变量定义的一般形式为:类型说明符(*指针变量名)(参数表);首先“(*指针变量名)”,说明是在定义指针变量;其次“(参数表)”,说明指针指向函数;最后“类型说明符”,表示被指函数的返回值的类型。,C程序设计快速进阶大学教程,2023/7/5,69,11.4.4 指向函数的指针,例11.20 计算两个整数最大值通过函数指针调用函数#includeint max(int i1,int i2)if(i1i2)return i1;elsereturn i2;,int main()int(*pf)(int,int);/*定义函数指针*/in

47、t i1,i2,i3;pf=max;/*函数名赋值给函数指针变量*/printf(input two numbers:n);scanf(%d%d,C程序设计快速进阶大学教程,2023/7/5,70,11.4.4 指向函数的指针,函数指针变量形式调用函数的步骤如下:(1)先定义函数指针变量:int(*pf)(int,int);(2)把被调函数的入口地址(函数名)赋予该函数指针变量:pf=max;(3)用函数指针变量形式调用函数:i3=(*pf)(i1,i2);使用函数指针变量还应注意以下两点:(1)函数指针变量不能进行算术运算,这是与数组指针变量不同的。(2)函数调用中(*指针变量名)的两边的括

48、号不可少。,课堂练习,一个学习小组有10个人,每个人学习3门课程,用10行3列浮点型数组存储。编写函数计算每个人的总成绩,参数为flaot(*p)3类型。,C程序设计快速进阶大学教程,2023/7/5,71,C程序设计快速进阶大学教程,2023/7/5,72,11.5 字符串,字符串常量是由一对双引号括起的字符序列。例如:C Language、student、123等都是合法的字符串常量。字符串常量和字符常量是不同的。它们主要区别:(1)字符常量由单引号括起来,字符串常量由双引号括起来。(2)字符常量只能是单个字符,字符串常量则可以含零个或多个字符。(3)可以把一个字符常量赋予一个字符变量,但

49、不能把一个字符串常量赋予一个字符变量。在语言中没有相应的字符串变量,但是可以用一个字符数组来存放一个字符串常量。,C程序设计快速进阶大学教程,2023/7/5,73,11.5 字符串,(4)字符常量占一个字节的内存空间。字符串不像其他其它数据类型具有固定的长度,不同字符串是不等长的,因此,字符串的存储不光需要存储其起始位置,还应该记载其结束位置。字符串常量占的内存字节数等于字符串中字节数加1,增加的一个字节中存放字符0(ASCII码为0),这是字符串结束的标志。例如:字符串“C Language”在内存中所占的字节(11),C程序设计快速进阶大学教程,2023/7/5,74,11.5.1 字符

50、数组与字符串,在语言中没有专门的字符串变量,通常用一个字符数组来存放一个字符串。字符串是以0作为串的结束符。因此当把一个字符串存入一个数组时,也把结束符0存入数组,并以此作为该字符串是否结束的标志。有了0标志后,就不必再用字符数组的长度来判断字符串的长度了。,C程序设计快速进阶大学教程,2023/7/5,75,11.5.1 字符数组与字符串,语言允许用字符串的方式对数组作初始化赋值,但是,与用字符初始化是有区别的。char cArr=C,l,a,n,g,u,a,g,e;数组cArr大小为10。可写利用字符串初始化为:char cArr=C Language;或去掉写为:char cArr=C

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号