九章指针ppt课件教案

上传人:博****1 文档编号:568258196 上传时间:2024-07-23 格式:PPT 页数:111 大小:1.29MB
返回 下载 相关 举报
九章指针ppt课件教案_第1页
第1页 / 共111页
九章指针ppt课件教案_第2页
第2页 / 共111页
九章指针ppt课件教案_第3页
第3页 / 共111页
九章指针ppt课件教案_第4页
第4页 / 共111页
九章指针ppt课件教案_第5页
第5页 / 共111页
点击查看更多>>
资源描述

《九章指针ppt课件教案》由会员分享,可在线阅读,更多相关《九章指针ppt课件教案(111页珍藏版)》请在金锄头文库上搜索。

1、C语语言言程程序序设设计计第第九九章章四川理工学院四川理工学院四川理工学院四川理工学院九章指针ppt课件Stillwatersrundeep.流静水深流静水深,人静心深人静心深Wherethereislife,thereishope。有生命必有希望。有生命必有希望C语语言言程程序序设设计计第第九九章章四川理工学院四川理工学院四川理工学院四川理工学院 指针指针是是C C语言中最重要的组成部分。利语言中最重要的组成部分。利用用指针指针可以表示可以表示 复杂的数据结构;动态分复杂的数据结构;动态分配内存;灵活处理字符串和数组;直接处配内存;灵活处理字符串和数组;直接处理内存地址;理内存地址; 从函数

2、调用中获取多个值等。从函数调用中获取多个值等。C语语言言程程序序设设计计第第九九章章四川理工学院四川理工学院四川理工学院四川理工学院对变量值的存取实质上是通过对变量值的存取实质上是通过地址地址进行的。进行的。示意图示意图9.1 指针的概念指针的概念 C语言中,任何一个语言中,任何一个变量名变量名实质上都代表着内实质上都代表着内存中的某一个存储单元,每一个存储单元都有一个存中的某一个存储单元,每一个存储单元都有一个地址地址。C系统能自动将系统能自动将变量名变量名和它的和它的地址地址联系起来。联系起来。变量定义及内存分配实例变量定义及内存分配实例对变量的两种访问方式:对变量的两种访问方式:直接访问

3、直接访问 和和间接访问间接访问inti,j,k;i=3;j=6;k=9;则编译时系统分别为则编译时系统分别为i,j,k各分配各分配2个字节。个字节。如如:2000,2001i2002,2003j2004,2005k例例例例图图图图 内存用户数据区内存用户数据区36920002000200220043010 变量变量 i变量变量 j变量变量 k变量变量 i_ pointer如如:inti=3;printf(“%d”,i);执行是执行是:根据变量名根据变量名i找到找到i的地址的地址(如如:2000),然后,然后从地址从地址2000开始的两开始的两个字节中取出数据个字节中取出数据(即变量的值即变量的

4、值3),再将再将其输出。这种据变量名按变量地址存取变其输出。这种据变量名按变量地址存取变量的值的量的值的方式叫方式叫“直接访问直接访问”方式。方式。说明说明说明说明重点重点重点重点2000i3inti=3;表示将表示将3送送到变量到变量i所占的内存单元中所占的内存单元中重点重点重点重点C语言允许定义和使用一种特殊的变量,语言允许定义和使用一种特殊的变量,这种变量专门用于存放其它变量的这种变量专门用于存放其它变量的地址地址。如前。如前面的变量面的变量i_pointer。如。如果把变量果把变量i的地址赋的地址赋给给i_pointer,即即i_pointer=&i。这。这样就样就可以通过变量可以通过

5、变量i_pointer获取变量获取变量i的地址,的地址,然后再然后再取出取出i的值。这种方式叫的值。这种方式叫“间接访问间接访问”方式。方式。如图所示如图所示:20002000i_pointer3将将3送到变量送到变量i_pointer所所指向指向的内存单元中的内存单元中C语语言言程程序序设设计计第第九九章章四川理工学院四川理工学院四川理工学院四川理工学院 指针指针: : 一个变量的一个变量的地址地址叫该变量的叫该变量的 “ “ 指针指针 ” ”。 指针变量指针变量: : 用于存放其它变量的用于存放其它变量的地址地址的变量。的变量。 指向指向: :如如 i_pointer= &ii_point

6、er= &i ,就称,就称i_pointeri_pointer指向变量指向变量i i 目标变量目标变量: : 指针变量所指向的变量。指针变量所指向的变量。有关指针的几个概念:有关指针的几个概念:C语语言言程程序序设设计计第第九九章章四川理工学院四川理工学院四川理工学院四川理工学院说明说明:1.类型说明符类型说明符表示指针变量所指向的变量的类型,表示指针变量所指向的变量的类型,同类型变量的地址才能放到指向该类型变量的指针同类型变量的地址才能放到指向该类型变量的指针变量中。变量中。例如例如2.不能把一个不能把一个整型量整型量或任何其它或任何其它非地址非地址类型的数据类型的数据赋给一个指针变量。赋给

7、一个指针变量。例如例如示例一示例一实例二实例二9.2变量的变量的指针指针和指向变量的和指向变量的指针变量指针变量一、指针变量的定义一、指针变量的定义格式格式:类型说明符类型说明符*标识符标识符如:如:int*pointer_1,*pointer_2;float*fp1,*fp2;例例例例例例例例&i&jpointer_1pointer_2ij如如:inti,j,*pointer_1,*pointer_2;若若:pointer_1=&i;pointer_2=&j;则则:flaotf1;int*p;p=&f1;(不正确不正确)例例例例如如:int*p;p=100;(不合法不合法)但但:p=NULL

8、或或p=0或或p=0则是合法则是合法的,都表示为指的,都表示为指针赋了针赋了“空值空值”。这并不意味着这并不意味着p指指向向地址为地址为0的单元,而是不指向的单元,而是不指向任何单元,但任何单元,但p中有确定的值。中有确定的值。例例例例C语语言言程程序序设设计计第第九九章章四川理工学院四川理工学院四川理工学院四川理工学院二、指针变量的引用二、指针变量的引用例例9.1main()inta,b;int*p1,*p2;a=100;b=10;p1=&a;p2=&b;printf(“%d,%dn”,a,b);printf(“%d,%dn”,*p1,*p2);结果结果:100,10100,10&a&b10

9、010p1p2ab*p1*p2“直接访问直接访问”方方式式“间接访问间接访问”方方式式C语语言言程程序序设设计计第第九九章章四川理工学院四川理工学院四川理工学院四川理工学院关于关于&与与*运算符的说明运算符的说明:1:&是取地址运算符。是取地址运算符。例如例如2.&,*,+,同优先级,同优先级,按从按从右至左方右至左方向结合。向结合。示例示例1 示例示例2 示例示例3如如:inta,*p1,*p2;p1=&a;则则:&*p1与与&a等效等效p2=&*p1;或或p2=&a;则则:p2也指向变量也指向变量a例子例子例子例子如如:&a,&b等。等。*是指针运算符。是指针运算符。用于定义时用于定义时表

10、示其后的表示其后的标识符标识符是是指针变量指针变量。而。而在程序中在程序中*p则表示指针变量则表示指针变量p所指所指向的变量,即向的变量,即目标变量目标变量。例子例子例子例子例子例子例子例子如如:inta,*p1;p1=&a;则则:*&a与与*p1等效,即等价于变量等效,即等价于变量a。&ap1*p1*&aa如如:inta,*p1;p1=&a;则则:(*p1)+等价于等价于a+但注意但注意*p1+不等价于不等价于(*p1)+因为因为*p1+等价于等价于*(p1+)即先得即先得p1所指向变量的所指向变量的值值,再使指针变量,再使指针变量p1的值自增。的值自增。例子例子例子例子C语语言言程程序序设

11、设计计第第九九章章四川理工学院四川理工学院四川理工学院四川理工学院例例9.2main()int*p1,*p2,*p,a,b;scanf(“%d,%d”,&a,&b);p1=&a;p2=&b;if(ab)p=p1;p1=p2;p2=p;printf(“a=%d,b=%dn”,a,b);printf(“max=%d,min=%dn”,*p1,*p2);如输入如输入:5,9 输出输出:a=5,b=9max=9,min=5数据指针交换示意图数据指针交换示意图 注意事项注意事项进行地址交换进行地址交换本程序是采用交换变量本程序是采用交换变量a和和b的地址来实现两个数的地址来实现两个数的比较的。且比较前后

12、的比较的。且比较前后a,b的值并未发生变化的值并未发生变化重点重点重点重点重点重点重点重点&a&b59&b&a95p1p2ppp1p2abab交换前交换前交换后交换后C语语言言程程序序设设计计第第九九章章四川理工学院四川理工学院四川理工学院四川理工学院三、三、指针变量作为函数的参数指针变量作为函数的参数函数调用时,把实际参数的值传递给形式参数。函数调用时,把实际参数的值传递给形式参数。指针变量可以作实际参数,其作用也是将实际参数指针变量可以作实际参数,其作用也是将实际参数的值传递给形式参数,这个时候的值代表是将一个变的值传递给形式参数,这个时候的值代表是将一个变量的量的地址,地址,把把地址地址

13、传送给被调函数的形式参数。传送给被调函数的形式参数。C语语言言程程序序设设计计第第九九章章四川理工学院四川理工学院四川理工学院四川理工学院例例9.3swap(int*p1,int*p2)intp;p=*p1;*p1=*p2;*p2=p;main()inta,b,*pointer_1,*pointer_2;scanf(“%d,%d”,&a,&b);pointer_1=&a;pointer_2=&b;if(ab)swap(pointer_1,pointer_2);printf(“n%d,%dn”,a,b);交换目标变量,即值的交换交换目标变量,即值的交换C语语言言程程序序设设计计第第九九章章四川理

14、工学院四川理工学院四川理工学院四川理工学院若输入若输入:5,9 输出为输出为:9,5&a&b59abpointer_1pointer_2&a&b&a&b59abp1p2pointer_1pointer_2&a&a&b&b95p1pointer_1p2pointer_2ab&a&b95abpointer_1pointer_2(a)(b)(c)(d)本程序采用的是交换本程序采用的是交换a和和b的的值值,而而p1和和p2的值不变。的值不变。同同例例9.2相反相反C语语言言程程序序设设计计第第九九章章四川理工学院四川理工学院四川理工学院四川理工学院如果把如果把swap函数改成函数改成:swap(int

15、*p1,int*p2)int*p;*p=*p1;*p1=*p2;*p2=*p;此句有问此句有问题题C语语言言程程序序设设计计第第九九章章四川理工学院四川理工学院四川理工学院四川理工学院swap(intx,inty)intt;t=x;x=y;y=t;55995995abxyabxy(a)(b)main()inta,b;scanf(“%d,%d”,&a,&b);if(ab)swap(a,b);printf(“n%d,%dn”,a,b);C语语言言程程序序设设计计第第九九章章四川理工学院四川理工学院四川理工学院四川理工学院说明说明:1.如想通过函数调用得到如想通过函数调用得到n个要改变的值。个要改变

16、的值。(1)在主调函数中设在主调函数中设n个变量,并用个变量,并用n个指针变量个指针变量指向它们。指向它们。(2)将指针变量作将指针变量作实参实参,使,使n个变量的个变量的地址地址传给所传给所调用的函数调用的函数形参形参。(3)通过形参指针变量,改变该通过形参指针变量,改变该n个变量的个变量的值值。(4)主调函数中就可以使用这些改变了值的变量。主调函数中就可以使用这些改变了值的变量。2.不能通过改变形参指针变量不能通过改变形参指针变量本身的值本身的值而使而使实参指实参指针变量的值针变量的值改变。改变。&ap1&aq1函数调用时函数调用时&bq1在被调函数中在被调函数中C语语言言程程序序设设计计

17、第第九九章章四川理工学院四川理工学院四川理工学院四川理工学院3.可以通过改变形参指针变量所可以通过改变形参指针变量所指向指向的变量的值来改的变量的值来改变实参指针变量所变实参指针变量所指向指向的变量的值。的变量的值。5a&ap1&aq1补例补例1:voidpoint(int*q1)q1+=2;main()int*p1,a=4;p1=&a;point(p1);printf(“%dn”,*p1);C语语言言程程序序设设计计第第九九章章四川理工学院四川理工学院四川理工学院四川理工学院4a&ap1&aq1补例补例2:voidpoint(int*q1)*q1+=2;main()int*p1,a=4;p1

18、=&a;point(p1);printf(“%dn”,*p1);C语语言言程程序序设设计计第第九九章章四川理工学院四川理工学院四川理工学院四川理工学院swap(int*p1,int*p2)int*p;p=p1;p1=p2;p2=p;main()inta,b,*pointer_1,*pointer_2;scanf(“%d,%d”,&a,&b);pointer_1=&a;pointer_2=&b;if(ab)swap(pointer_1,pointer_2);printf(“n%d,%dn”,a,b);本函数中试图通过改变本函数中试图通过改变形参指针变形参指针变量量的值来使的值来使实参指针变量实参

19、指针变量的值改变的值改变C语语言言程程序序设设计计第第九九章章四川理工学院四川理工学院四川理工学院四川理工学院a&a&b59bpointer_1pointer_2(a) &a&b59abp1p2(b) &b&a59abp1p2(c) a&b&a59bpointer_1pointer_2(d) &a&b59abpointer_1pointer_2(d) C语语言言程程序序设设计计第第九九章章四川理工学院四川理工学院四川理工学院四川理工学院exchange(int*q1,int*q2,int*q3)if(*q1*q2)swap(q1,q2);if(*q1*q3)swap(q1,q3);if(*q2

20、*q3)swap(q2,q3);例例9.4swap(int*pt1,int*pt2)intp;p=*pt1;*pt1=*pt2;*pt2=p;C语语言言程程序序设设计计第第九九章章四川理工学院四川理工学院四川理工学院四川理工学院main()inta,b,c,*p1,*p2,*p3;scanf(“%d,%d,%d”,&a,&b,&c);p1=&a;p2=&b;p3=&c;exchange(p1,p2,p3);printf(“n%d,%d,%dn”,a,b,c); 运行如下运行如下: 9 , 0 , 10 : 9 , 0 , 10 10 , 9 , 0 10 , 9 , C语语言言程程序序设设计计

21、第第九九章章四川理工学院四川理工学院四川理工学院四川理工学院C语语言言程程序序设设计计第第九九章章四川理工学院四川理工学院四川理工学院四川理工学院 9.3 9.3 数组的指针和指向数组的指针变量数组的指针和指向数组的指针变量 C C 语言中,指针变量可以指向变量,也可以指向语言中,指针变量可以指向变量,也可以指向数组数组和和数组元素数组元素。 数组的指针数组的指针: : 数组的数组的起始地址起始地址( ( 首地址首地址 ) ) 数组元素的指针数组元素的指针: : 数组元素的地址数组元素的地址C语语言言程程序序设设计计第第九九章章四川理工学院四川理工学院四川理工学院四川理工学院一、指向一维数组的

22、指针变量的定义与赋值一、指向一维数组的指针变量的定义与赋值指向数组的指针变量的定义同指向变量的指针变量的指向数组的指针变量的定义同指向变量的指针变量的定义相同。定义相同。如如:inta10;int*p;若若:p=&a0;则则p指向了指向了a数组的第数组的第0号元素。号元素。由于数组名代表数组的由于数组名代表数组的首地址首地址(即即起始地址起始地址),故故:p=&a0;等价于等价于p=a;也可也可:inta10;int*p=&a0;int*p=a;注意注意int*p=&a0;的含义是将数组的的含义是将数组的首地址首地址赋给赋给指针变量指针变量p,而不是赋给,而不是赋给(*p)。C语语言言程程序序

23、设设计计第第九九章章四川理工学院四川理工学院四川理工学院四川理工学院二、二、通过指针引用数组元素通过指针引用数组元素如如:inta10,*p;p=a;则则:(1)pa0的地址的地址p+1a1的地址的地址p+iai的地址的地址(2)*p=a0,*(p+1)=a1,*(p+i)=ai说明说明:1.数组元素在内存中是连续存放的,数组元素在内存中是连续存放的,C语言规定,语言规定,指针变量指针变量p+1指向下一个元素指向下一个元素(不不是简单的加是简单的加1)如数组元素为实型,如数组元素为实型,则则p+1所表示的实所表示的实际地址是际地址是p+1 d=p+1 4(d为一个数组元素所为一个数组元素所占的

24、字节数占的字节数)&C语语言言程程序序设设计计第第九九章章四川理工学院四川理工学院四川理工学院四川理工学院2.(p+i)表示指向表示指向ai的地址,而的地址,而a+i也表示也表示ai的地址,故的地址,故程序中程序中(p+i)等价于等价于a+i。如如:p+2;a+2;3.指向数组的指针变量可以带下标。指向数组的指针变量可以带下标。如如:pi*(p+i)综上所述综上所述:数组元素的引用可以数组元素的引用可以:(1)下标法下标法:数组名数组名下标下标或或指针变量名指针变量名下标下标(2)指针法指针法:*(p+i)或或*(a+i)(假定假定:inta10,*p=a;)a数组数组pp+1,a+1p+i,

25、a+ip+9,a+9a0a1aia9*(p+i)C语语言言程程序序设设计计第第九九章章四川理工学院四川理工学院四川理工学院四川理工学院例例9.5用三种方法输出数组各元素。用三种方法输出数组各元素。(1)下标法下标法main()inta10,i;for(i=0;i10;i+)scanf(“%d”,&ai);printf(“n”);for(i=0;i10;i+)printf(“%d”,ai);C语语言言程程序序设设计计第第九九章章四川理工学院四川理工学院四川理工学院四川理工学院(2)用数组名计算元素地址用数组名计算元素地址main()inta10,i;for(i=0;i10;i+)scanf(“%

26、d”,&ai);printf(“n”);for(i=0;i10;i+)printf(“%d”,*(a+i);C语语言言程程序序设设计计第第九九章章四川理工学院四川理工学院四川理工学院四川理工学院(3)用指针变量指向数组元素用指针变量指向数组元素main()inta10,i,*p;for(i=0;i10;i+)scanf(“%d”,&ai);printf(“n”);for(p=a;p(a+10);p+)printf(“%d”,*p);C语语言言程程序序设设计计第第九九章章四川理工学院四川理工学院四川理工学院四川理工学院注意几点注意几点: : (1)(1) 指针变量可以作自增,自减运算。指针变量可

27、以作自增,自减运算。 如如: : + + + p p , , p p 而数组名不能作自增,自减运算。而数组名不能作自增,自减运算。 如如: : a a + + , + + , a a 等均不合法。因为等均不合法。因为数组名是常量数组名是常量。 (2) (2) 注意指针变量的当前值。注意指针变量的当前值。 如如: : 例例 9.6 9.6 C语语言言程程序序设设计计第第九九章章四川理工学院四川理工学院四川理工学院四川理工学院main()inta10,i,*p;p=a;for(i=0;i10;i+)scanf(“%d”,p+);printf(“n”);for(i=0;i10;i+,p+)print

28、f(“%d”,*p);for(i=0,p=a;i10;i+,p+)或或for(p=a;pa+10;p+)pa数组数组C语语言言程程序序设设计计第第九九章章四川理工学院四川理工学院四川理工学院四川理工学院(3)注意指针变量的运算注意指针变量的运算如如:inta10,i,*p;p=a;则则:a.p+(或或p+=1)表示表示p指向指向a1,此时若执行此时若执行*p则取出则取出a1元素的值。元素的值。b.“*”与与“+”同优先级,自右往左结合。同优先级,自右往左结合。如如:*p+等效于等效于*(p+),即先取即先取p所指向变量的值,所指向变量的值,再使再使p+1。而。而*(p+)与与*(+p)的作用不

29、同。前的作用不同。前者先取者先取*p的值,后使的值,后使p+1;后者是先使后者是先使p+1,再,再取取*p的值的值。c.(*p)+表示使目标变量的值加表示使目标变量的值加1。而不是指针变而不是指针变量的值加量的值加1d.*(p+)等价于等价于ai+*(+p)等价于等价于a+i即先使即先使p自增自增,再作再作*运算。运算。C语语言言程程序序设设计计第第九九章章四川理工学院四川理工学院四川理工学院四川理工学院如如:main()inta100,*p;p=a;while(pa+100)printf(“%d”,*p+);main()inta100,*p;p=a;while(pa+100)printf(“

30、%d”,*p);p+;C语语言言程程序序设设计计第第九九章章四川理工学院四川理工学院四川理工学院四川理工学院三、 数组名作函数参数 数组名作函数参数时,实际上是将实参数组的首地址 传给形参。这样实参数组与形参数组共占同一段内存。 使得在调用函数过程中,形参数组中元素值发生变化也 就使实参数组的元素值随之而发生变化。C语语言言程程序序设设计计第第九九章章四川理工学院四川理工学院四川理工学院四川理工学院main()f(intarr,intn)intarray10;f(array,10);C语语言言程程序序设设计计第第九九章章四川理工学院四川理工学院四川理工学院四川理工学院voidinv(intx,

31、intn)intt,i,j,m=(n1)/2;for(i=0;i=m;i+)j=n1i;t=xi;xi=xj;xj=t;return;可去掉可去掉3 7 9 11 0 6 7 5 4 22 4 5 7 6 0 11 9 7 3imj例例9.7将数组将数组a中中n个整数按相个整数按相反顺序反顺序存放。存放。即将即将第一第一个元素和个元素和最后最后一个元素对换,将第二个同倒一个元素对换,将第二个同倒数第二个对换数第二个对换.即两两对换,直到即两两对换,直到:a(n1)/2与与an(n1)/21对换为止。对换为止。C语语言言程程序序设设计计第第九九章章四川理工学院四川理工学院四川理工学院四川理工学院

32、voidmain()staticinti,a10=3,7,9,11,0,6,7,5,4,2;printf(“Theoriginalarray:n”);for(i=0;i10;i+)printf(“%d,”,ai);printf(“n”);inv(a,10);printf(“Thearrayhasbeeninverted:n”);for(i=0;i10;i+)printf(“%d,”,ai);printf(“n”);运行结果运行结果:Theoriginalarray:3,7,9,11,0,6,7,5,4,2Thearrayhasbeeninverted:2,4,5,7,6,0,11,9,7,C语

33、语言言程程序序设设计计第第九九章章四川理工学院四川理工学院四川理工学院四川理工学院以上程序也可以改为如下以上程序也可以改为如下:voidinv(int*x,intn)int*p,t,*i,*j,m=(n1)/2;i=x;j=x+n1;p=x+m;for(;i=p;i+,j)t=*i;*i=*j;*j=t;return;a数组数组a0a1.a9370i,xp=x+mj24 C语语言言程程序序设设计计第第九九章章四川理工学院四川理工学院四川理工学院四川理工学院main()staticinti,a10=3,7,9,11,0,6,7,5,4,2;printf(“Theoriginalarray:n”)

34、;for(i=0;i10;i+)printf(“%d”,ai);printf(“n”);inv(a,10);printf(“Thearrayhasbeeninverted:n”);for(i=0;i10;i+)printf(“%d”,ai);printf(“n”);C语语言言程程序序设设计计第第九九章章四川理工学院四川理工学院四川理工学院四川理工学院intmax,min;voidmax_min_value(intarray,intn)int*p,*array_end;array_end=array+n;max=min=*array;for(p=array+1;pmax)max=*p;elsei

35、f(*pmin)min=*p;return;等价于等价于*(array+0)即即array0例例9.8从从10个数中找出其中最大值和最小值个数中找出其中最大值和最小值C语语言言程程序序设设计计第第九九章章四川理工学院四川理工学院四川理工学院四川理工学院voidmain()inti,number10;printf(“enter10datan”);for(i=0;i10;i+)scanf(“%d”,&numberi);max_min_value(number,10);printf(“nmax=%d,min=%dn”,max,min);运行结果运行结果:enter10data246803456789

36、100 max=100,min=C语语言言程程序序设设计计第第九九章章四川理工学院四川理工学院四川理工学院四川理工学院此例也可改用指针变量来传送地址,程序可改为此例也可改用指针变量来传送地址,程序可改为:intmax,min;voidmax_min_value(int*array,intn)int*p,*array_end;array_end=array+n;max=min=*array;for(p=array+1;pmax)max=*p;elseif(*pmin)min=*p;return;C语语言言程程序序设设计计第第九九章章四川理工学院四川理工学院四川理工学院四川理工学院voidmain

37、()inti,number10,*p;p=number;printf(“enter10datan”);for(i=0;i10;i+,p+)scanf(“%d”,p);printf(“the10data:n”);for(p=number,i=0;i10;i+,p+)printf(“%d”,*p);p=number;max_min_value(p,10);printf(“nmax=%d,min=%dn”,max,min);for(p=number;p(number+10);p+) 综上所述,对于实参数组想在被调函数中改变综上所述,对于实参数组想在被调函数中改变此数组元素的值,实参与形参的对应关系可

38、以如下此数组元素的值,实参与形参的对应关系可以如下: :C语语言言程程序序设设计计第第九九章章四川理工学院四川理工学院四川理工学院四川理工学院(1)二者都用数组名二者都用数组名main()f(intx,intn)inta10;f(a,10);特点特点:a和和x数组共用同一段内存单元。数组共用同一段内存单元。(2)实参为数组名,形参用指针变量实参为数组名,形参用指针变量main()f(int*x,intn)inta10;f(a,10);C语语言言程程序序设设计计第第九九章章四川理工学院四川理工学院四川理工学院四川理工学院(2)实参为数组名,形参用指针变量实参为数组名,形参用指针变量main()f

39、(int*x,intn)inta10;f(a,10);特点特点:实参将数组的首地址传给形参指针变量,通过指实参将数组的首地址传给形参指针变量,通过指针变量指向数组中的任一元素针变量指向数组中的任一元素,进而作相应的处理。进而作相应的处理。C语语言言程程序序设设计计第第九九章章四川理工学院四川理工学院四川理工学院四川理工学院(3)二者都用指针变量二者都用指针变量main()f(int*x,intn)inta10,*p;p=a;f(p,10);特点特点:先使先使p指向指向a数组,再将数组,再将p传给传给x,使使x也指也指向向a数组,从而进行处理。数组,从而进行处理。C语语言言程程序序设设计计第第九

40、九章章四川理工学院四川理工学院四川理工学院四川理工学院(4)实参为指针变量,而形参为数组名实参为指针变量,而形参为数组名main()f(intx,intn)inta10,*p;p=a;f(p,10);特点特点:利用指针变量将利用指针变量将a数组的首地址传给数组的首地址传给x数组。使数组。使两数组共用同一段内存单元。利用两数组共用同一段内存单元。利用xi值的变化,值的变化,使使ai的值也发生变化。的值也发生变化。注意注意:在上述四种处理方式中,当用指针变量作实参时,在上述四种处理方式中,当用指针变量作实参时,必须先使指针变量有确定的值,即指向一个已定必须先使指针变量有确定的值,即指向一个已定义的

41、数组。义的数组。C语语言言程程序序设设计计第第九九章章四川理工学院四川理工学院四川理工学院四川理工学院四四、二维数组的指针和指向二维数组的指针变量、二维数组的指针和指向二维数组的指针变量1.二维数组和数组元素的地址二维数组和数组元素的地址C语言中二维数组实际上是由若干个按行存放的一语言中二维数组实际上是由若干个按行存放的一维数组构成的。如:维数组构成的。如:inta34;a0a00a01a02a03a1a10a11a12a13a2a20a21a22a23a代表首元素的地址,而此时首元素代表首元素的地址,而此时首元素a0又是一个包含又是一个包含有有4个元素的一维数组。所以个元素的一维数组。所以a

42、(或或a+0)表示二维数组表示二维数组第第0行的地址。同理:行的地址。同理:a+1,a+2分别表示二维数组分别表示二维数组第第1行和第行和第2行的地址。所以,二维数组名是一个行的地址。所以,二维数组名是一个行指行指针针。a0,a1,a2分别表示一维数组名,所以分别表示一维数组名,所以a0代代表表一维数组一维数组a0中第中第0列元素的地址,即列元素的地址,即&a00。C语语言言程程序序设设计计第第九九章章四川理工学院四川理工学院四川理工学院四川理工学院同理:同理:a1的值为的值为&a10,a2的值为的值为&a20。二维数组元素的地址可表示为:二维数组元素的地址可表示为:(1)&aij(2)ai+

43、j(3)*(a+i)+j(因为因为ai等价于等价于*(a+i)二维数组元素的引用可表示为:二维数组元素的引用可表示为:(1)aij(2)*(ai+j)(3)*(*(a+i)+j)2.指向二维数组的指针变量指向二维数组的指针变量(1)指向二维数组的指向二维数组的列指针列指针变量变量inta34,*p;C语语言言程程序序设设计计第第九九章章四川理工学院四川理工学院四川理工学院四川理工学院如:如:p=a0;或或p=&a00;p=*(a+0);p=*a;则则p是一个指向二维数组是一个指向二维数组a第第0行第行第0列元素的指列元素的指针针变量。变量。(即即p是一个是一个列指针变量列指针变量)此时此时p+

44、1则指向第则指向第0行行第第1列的元素。列的元素。说明:说明:上述上述p=a0;不能写成不能写成p=a;因为尽管因为尽管a0和和a都表示地址且都表示地址且值相同,但二者的值相同,但二者的地址基类型地址基类型不同。不同。即即a0是一个是一个列地址列地址,而,而a是一个是一个行地址行地址。1357246811121314p p+C语语言言程程序序设设计计第第九九章章四川理工学院四川理工学院四川理工学院四川理工学院#include“stdio.h”voidmain()inta34=1,2,3,4,9,8,7,6,10,11,5,2;int*p=a0;(或或int*p=&a00;)for(;pa0+1

45、2;p+)if(pa0)%4=0)printf(“n”);printf(“%4d”,*p);(2)指向二维数组的指向二维数组的行指针行指针变量变量由于二维数组是由按行存放的一维数组构成,由于二维数组是由按行存放的一维数组构成,C语语言中可以用言中可以用行指针变量行指针变量来引用二维数组元素。来引用二维数组元素。C语语言言程程序序设设计计第第九九章章四川理工学院四川理工学院四川理工学院四川理工学院定义格式:定义格式:数据类型数据类型(*标示符标示符)常量常量如:如:int(*p)4;表示表示p所指的对象是有所指的对象是有4个整型元素的数组。个整型元素的数组。inta34,(*p)4;若:若:p=

46、a;则则p是指向是指向a数组第数组第0行行的指针变量,的指针变量,即即p是一个是一个行指针变量行指针变量。此时,此时,p+1则指向则指向a数组第数组第1行,行,p+i则指向则指向a数组第数组第i行。行。所以,所以,*(p+i)+j表示表示a数组数组中第中第i行行j列元素的地址。列元素的地址。而而*(*(p+i)+j)则表示表示则表示表示a数组中第数组中第i行行j列元素的列元素的值值。注意注意不能写成不能写成p=a0。1357246811121314pp+C语语言言程程序序设设计计第第九九章章四川理工学院四川理工学院四川理工学院四川理工学院例:例:输出二维数组任意行任意例元素的值。输出二维数组任

47、意行任意例元素的值。voidmain()inta34=1,2,3,4,9,8,7,6,10,11,5,2;int(*p)4,i,j;p=a;scnaf(“i=%d,j=%d”,&i,&j);printf(“a%d,%d=%dn”,i,j,*(*(p+i)+j);3.二维数组名和指向二维数组的指针变量作函数参数二维数组名和指向二维数组的指针变量作函数参数补充例:补充例:用用函数调用方式函数调用方式编写程序找出二维数组编写程序找出二维数组a中每中每行的最小值并输出。要求:行的最小值并输出。要求:(1)二维数组元素的值用随机函数产生二维数组元素的值用随机函数产生(050)之间之间(2)每行中元素的最

48、小值在每行中元素的最小值在line_min()函数中求出。函数中求出。(3)在主函数中输出每行的最小值。在主函数中输出每行的最小值。C语语言言程程序序设设计计第第九九章章四川理工学院四川理工学院四川理工学院四川理工学院 voidmain()1、定义一个二维数组定义一个二维数组2、调调随机函数随机函数对二维数组对二维数组元素元素赋值赋值3、调用调用line_min函数函数4、输出结果到屏幕输出结果到屏幕line_min()1、接收实参接收实参2、求二维数组每行中的最小值求二维数组每行中的最小值C语语言言程程序序设设计计第第九九章章四川理工学院四川理工学院四川理工学院四川理工学院方法一、方法一、用

49、用列指针列指针来求解来求解#include“stdlib.h”#defineN3#defineM4voidmain()intaNM,min,i,j;for(i=0;iN;i+)for(j=0;jM;j+)aij=random(50);printf(“%4d”,aij);if(j+1)%4=0)printf(“n”);for(i=0;iN;i+)min=line_min(ai);printf(“a%d:min=%dn”,i,min);C语语言言程程序序设设计计第第九九章章四川理工学院四川理工学院四川理工学院四川理工学院line_min(int*p)intj,min;min=*(p+0);for(

50、j=1;j*(p+j)min=*(p+j);returnmin;方法二、方法二、用用行指针行指针来求解来求解C语语言言程程序序设设计计第第九九章章四川理工学院四川理工学院四川理工学院四川理工学院#include“stdlib.h”#defineN3#defineM4voidmain()intaNM,min,i,j;for(i=0;iN;i+)for(j=0;jM;j+)aij=random(50);printf(“%4d”,aij);if(j+1)%4=0)printf(“n”);for(i=0;iN;i+)min=line_min(a+i);printf(“a%d:min=%dn”,i,mi

51、n);C语语言言程程序序设设计计第第九九章章四川理工学院四川理工学院四川理工学院四川理工学院line_min(int(*p)M)intj,min;min=*(*p);for(j=1;j*(*p+j)min=*(*p+j);returnmin;说明:说明:random(x)函数能产生一个函数能产生一个(0x1)间的间的随机整数。随机整数。相关的函数有:相关的函数有:rand(),其功能是产生,其功能是产生032767间的随机数。间的随机数。如:如:(rand()%90+10.0)/10.0就能产生就能产生1.010.0之间的实数。之间的实数。C语语言言程程序序设设计计第第九九章章四川理工学院四川

52、理工学院四川理工学院四川理工学院9.4字符串的指针和指向字符串的指针变量字符串的指针和指向字符串的指针变量字符串的指针字符串的指针就是字符串的就是字符串的首地址首地址。一、一、字符串的表示形式字符串的表示形式1:用字符数组实现用字符数组实现例例9.16main()staticcharstring=“ILoveChina”;printf(“%sn”,string);例中例中string是数组名,是数组名,它表示字符数组的它表示字符数组的首地址首地址。相应的相应的stringi表示数组中的一个元素。如表示数组中的一个元素。如:string4代表第代表第5个元素,即个元素,即字母字母v2:用字符指针

53、实现用字符指针实现C语语言言程程序序设设计计第第九九章章四川理工学院四川理工学院四川理工学院四川理工学院char*string;string=“ILoveChina”;或者或者:char*string=“ILoveChina”;其含义是将字符串的其含义是将字符串的首地址首地址赋给指针变量赋给指针变量string。尽管没有直接定义字符型数组,但实际上尽管没有直接定义字符型数组,但实际上C语言对字符语言对字符串常量均按字符数组来处理。即在内存中开辟了一个字符串常量均按字符数组来处理。即在内存中开辟了一个字符数组用来存放字符串常量。数组用来存放字符串常量。例例9.17main()char*strin

54、g=“ILoveChina”;printf(“%sn”,string);C语语言言程程序序设设计计第第九九章章四川理工学院四川理工学院四川理工学院四川理工学院注意注意:C语言中对字符串可以进行整体输入和输出。语言中对字符串可以进行整体输入和输出。而对数值型数组则不能用数组名来输出它的全部而对数值型数组则不能用数组名来输出它的全部元素,只能逐个元素输出。元素,只能逐个元素输出。对字符串的处理可以用对字符串的处理可以用下标法下标法,也可用,也可用指针法指针法。例例9.18将字符串将字符串a复制到字符串复制到字符串b。main()chara=“Iamaboy.”,b20;for(i=0;*(a+i)

55、!=0;i+)*(b+i)=*(a+i);*(b+i)=0;printf(“stringais:%sn”,a);C语语言言程程序序设设计计第第九九章章四川理工学院四川理工学院四川理工学院四川理工学院printf(“stringbis:”);for(i=0;bi!=0;i+)printf(“%c”,bi);printf(“n”);运行结果运行结果:stringais:Iamaboy.stringbis:Iamaboy.例例9.19用指针变量来处理例用指针变量来处理例9.18问题问题.main()chara=“Iamaboy.”,b20,*p1,*p2;inti;p1=a;p2=b;for(;*p

56、1!=0;p1+,p2+)C语语言言程程序序设设计计第第九九章章四川理工学院四川理工学院四川理工学院四川理工学院*p2=*p1;*p2=0;printf(“stringais:%sn”,a);printf(“stringbis:”);for(i=0;bi!=0;i+)printf(“%c”,bi);printf(“n”);Iamaboy.0ap1p1bp2p2二、二、字符串指针作函数参数字符串指针作函数参数用用字符数组名字符数组名和指向字符串的和指向字符串的指针指针变量变量作函数参数,均可以处理字符串。作函数参数,均可以处理字符串。例例9.20用函数调用实现字符串的复制。用函数调用实现字符串的

57、复制。IC语语言言程程序序设设计计第第九九章章四川理工学院四川理工学院四川理工学院四川理工学院(1)用字符数组作函数参数用字符数组作函数参数voidcopy_string(charfrom,charto)inti=0;while(fromi!=0)(先判断,后赋值先判断,后赋值)toi=fromi;i+;toi=0;main()chara=“Iamateacher.”;charb=“youareastudent.”;printf(“string_a=%snstring_b=%sn”,a,b);copy_string(a,b);printf(“nstring_a=%snstring_b=%sn”

58、,a,b);C语语言言程程序序设设计计第第九九章章四川理工学院四川理工学院四川理工学院四川理工学院运行结果运行结果:string_a=Iamateacher.string_b=youareastudent.string_a=Iamateacher.string_b=Iamateacher.本程序本程序main函数中也可用字符型指针变量函数中也可用字符型指针变量。改写如下改写如下:main()char*a=“Iamateacher.”;char*b=“youareastudent.”;printf(“string_a=%snstring_b=%sn”,a,b);copy_string(a,b);

59、printf(“nstring_a=%snstring_b=%sn”,a,b);C语语言言程程序序设设计计第第九九章章四川理工学院四川理工学院四川理工学院四川理工学院(2)形参用字符指针变量形参用字符指针变量voidcopy_string(char*from,char*to)for(;*from!=0;from+,to+)*to=*from;*to=0;main()char*a=“Iamateacher.”;char*b=“youareastudent.”;printf(“string_a=%snstring_b=%sn”,a,b);copy_string(a,b);printf(“nstri

60、ng_a=%snstring_b=%sn”,a,b);C语语言言程程序序设设计计第第九九章章四川理工学院四川理工学院四川理工学院四川理工学院(3)对对copy_string函数的简化函数的简化a.voidcopy_string(char*from,char*to)while(*to=*from)!=0)from+;to+;即先赋值,后判断即先赋值,后判断。故故*to=0语句不要语句不要。b.voidcopy_string(char*from,char*to)while(*to+=*from+)!=0);注意分号C语语言言程程序序设设计计第第九九章章四川理工学院四川理工学院四川理工学院四川理工学

61、院c.voidcopy_string(char*from,char*to)while(*from!=0)*to+=*from+;*to=0;d.voidcopy_string(char*from,char*to)while(*from)*to+=*from+;*to=0;*from!=0*from!=0while(*from!=0)C语语言言程程序序设设计计第第九九章章四川理工学院四川理工学院四川理工学院四川理工学院e.voidcopy_string(char*from,char*to)while(*to+=*from+);f.voidcopy_string(char*from,char*to

62、)for(;(*to+=*from+)!=0;);for(;*to+=*from+;);C语语言言程程序序设设计计第第九九章章四川理工学院四川理工学院四川理工学院四川理工学院综上所述,用函数调用来处理字符串时,函数参数可以综上所述,用函数调用来处理字符串时,函数参数可以有以下几种情况有以下几种情况:实参实参形参形参1.数数组组名名数数组组名名2.数数组组名名字符指针变量字符指针变量3.字符指针变量字符指针变量字符指针变量字符指针变量4.字符指针变量字符指针变量数数组组名名三三、字符指针变量与字符数组的区别字符指针变量与字符数组的区别1.字符数组由若干个元素构成,每一个元素中存放一字符数组由若干

63、个元素构成,每一个元素中存放一个字符。而字符指针变量中存放的是字符串的首地个字符。而字符指针变量中存放的是字符串的首地址。绝非将字符串放在字符指针变量中。址。绝非将字符串放在字符指针变量中。2.赋值方式可以不同。如赋值方式可以不同。如:C语语言言程程序序设设计计第第九九章章四川理工学院四川理工学院四川理工学院四川理工学院staticcharstr=“Hellow”;char*a=“Hellow”;对指针变量也可以对指针变量也可以:char*a;a=“Hellow”;而而:staticcharstr10;str=“Hellow”;3.数组定义后,在编译时就已分配内存单元,即有确定数组定义后,在编

64、译时就已分配内存单元,即有确定的值。而对指针变量定义后,尽管系统给其分配了内的值。而对指针变量定义后,尽管系统给其分配了内存单元,但在没有明确指向前,其值是不确定的。存单元,但在没有明确指向前,其值是不确定的。如如:charstr10;scanf(“%s”,str);而而:char*a;scanf(“%s”,a);不合法不合法(可以可以)(不可以不可以)合法合法C语语言言程程序序设设计计第第九九章章四川理工学院四川理工学院四川理工学院四川理工学院可改为可改为:char*astr10;a=str;scanf(“%s”,a);4.指针变量的值可以改变,而数组名则不行。指针变量的值可以改变,而数组名

65、则不行。例例9.21(p240)main()char*a=“IloveChina!”;a=a+7;printf(“%s”,a);运行结果运行结果:China!而下面程序则是错的而下面程序则是错的:C语语言言程程序序设设计计第第九九章章四川理工学院四川理工学院四川理工学院四川理工学院main()staticcharstr=“IloveChina!”;str=str+7;printf(“%s”,str);可改为可改为:main()staticcharstr=“IloveChina!”;printf(“%s”,str+7);此时输出为此时输出为:China!C语语言言程程序序设设计计第第九九章章四川

66、理工学院四川理工学院四川理工学院四川理工学院例例9.22(p240)main()char*a=“ILOVECHINA.”;inti;printf(“Thesixthcharacteris%cn”,a5);for(i=0;ai!=0;i+)printf(“%c”,ai);运行结果运行结果:ThesixthcharacterisEILOVECHINA.指针变量带下标方式引指针变量带下标方式引用字符等价于用字符等价于*(a+i)C语语言言程程序序设设计计第第九九章章四川理工学院四川理工学院四川理工学院四川理工学院5.可用指针变量指向一个格式字符串,用以代替可用指针变量指向一个格式字符串,用以代替pr

67、intf函数中的格式控制。函数中的格式控制。如如:char*format;format=“a=%d,b=%fn”;printf(format,a,b);当然也可用字符数组。当然也可用字符数组。如如:staticcharformat=“a=%d,b=%fn”;printf(format,a,b);由于不能对字符数组整体赋值,所以用指针变量就更由于不能对字符数组整体赋值,所以用指针变量就更方便灵活。方便灵活。如如:C语语言言程程序序设设计计第第九九章章四川理工学院四川理工学院四川理工学院四川理工学院char*format;format=“a=%d,b=%fn”;printf(format,a,b)

68、;format=“c=%c,d=%un”;printf(format,c,d);charformat=“a=%d,b=%fn”;printf(format,a,b);format=“c=%c,d=%un”;printf(format,c,d);C语语言言程程序序设设计计第第九九章章四川理工学院四川理工学院四川理工学院四川理工学院补例补例1:下列程序输出结果为下列程序输出结果为#include“stdio.h”charfun(char*s)if(*s=A)*s+=32;return*s;main()charc80=“MyBook”,*p;p=c;while(*p)*p=fun(p);putcha

69、r(*p);p+;printf(“n”);C语语言言程程序序设设计计第第九九章章四川理工学院四川理工学院四川理工学院四川理工学院补例补例2:下列程序输出结果为下列程序输出结果为point1(intx,inty)intt=1;x=x+t;y=y+t;return;point2(int*x,int*y)intt=1;*x=*x+t;*y=*y+t;return;voidpoint3(char*p)p+=1;*p=*p+1;C语语言言程程序序设设计计第第九九章章四川理工学院四川理工学院四川理工学院四川理工学院main()charb4=a,c,s,f,*pt=b;intx=3,y=4;point1(x

70、,y);31printf(“%d,%dn”,x,y);point2(&x,&y);32printf(“%d,%dn”,x,y);point3(pt);33printf(“%cn”,*(pt+1);3132333,44,C语语言言程程序序设设计计第第九九章章四川理工学院四川理工学院四川理工学院四川理工学院9.5 函数的指针和指向函数的指针变量一、用函数指针变量调用函数 函数的指针: 函数的入口地址 函数的指针变量: 指向函数入口地址的指针变量 一个已定义的函数在编译时,系统为其分配一个入口 地址,并用函数名表示。通过指向函数的指针变量,也 可以调用函数。 指向函数的指针变量的一般定义形式: 数据

71、类型 (*标识符) ( ) ; 其中: 数据类型是指函数返回值的类型。 如: int (*p ) ( ) ; 例 9.23 (p241) 求 a 和 b 中的大者。C语语言言程程序序设设计计第第九九章章四川理工学院四川理工学院四川理工学院四川理工学院main()intmax(int,int);intmax();inta,b,c;scanf(“%d,%d”,&a,&b);c=max(a,b);printf(“a=%d,b=%d,max=%d”,a,b,c);max(intx,inty)intz;if(xy)z=x;elsez=y;return(z);C语语言言程程序序设设计计第第九九章章四川理工

72、学院四川理工学院四川理工学院四川理工学院本例也可在本例也可在main函数中,用指向函数的指针变量来调函数中,用指向函数的指针变量来调用用max函数。函数。如如:main()intmax();int(*p)();inta,b,c;p=max;scanf(“%d,%d”,&a,&b);c=(*p)(a,b);c=max(a,b);printf(“a=%d,b=%d,max=%d”,a,b,c);说明说明:1.C语言中,函数调用可以有两种形式。语言中,函数调用可以有两种形式。即即函数名函数名调用和调用和函数指针函数指针调用。调用。定义指向函数的指针变量定义指向函数的指针变量C语语言言程程序序设设计计

73、第第九九章章四川理工学院四川理工学院四川理工学院四川理工学院2.(*p)()表示一个指向函数的指针变量,用于存放函表示一个指向函数的指针变量,用于存放函数的入口地址。数的入口地址。若把某一个函数的入口地址赋给它,若把某一个函数的入口地址赋给它,它就指向该函数。即在程序中一个函数指针变量可以它就指向该函数。即在程序中一个函数指针变量可以先后指向不同的函数。先后指向不同的函数。3.对于指向函数的指针变量作自增或自减运算均无意对于指向函数的指针变量作自增或自减运算均无意义如义如:int(*p)();则则:p+;p+n;p;(均无意义均无意义)因为因为p只能指向函数的入口地址,而不能指向函数只能指向函

74、数的入口地址,而不能指向函数内的某一条指令。内的某一条指令。二、用指向函数的指针变量作函数参数二、用指向函数的指针变量作函数参数函数指针变量作函数参数函数指针变量作函数参数时,它是将时,它是将函数名函数名(即函数即函数的的入口地址入口地址)传给形参传给形参。C语语言言程程序序设设计计第第九九章章四川理工学院四川理工学院四川理工学院四川理工学院如如:main().sub(f1,f2);.sub(f3,f4);sub(int(*x1)(int),int(*x2)(int,int)inta,b,i,j;a=(*x1)(i);a=f1(i)b=(*x2)(i,j);b=f2(i,j)f1函数函数x1f

75、1f2函数函数x2f2f3函数函数x1f3f4函数函数x2f4优点优点:程序中要多次调用程序中要多次调用sub函数,且每次要调用的函数函数,且每次要调用的函数不固定时,只需给出不同的不固定时,只需给出不同的函数名作实参函数名作实参即可。而即可。而sub函函数不必作任何修改,这符合结构化程序设计方法的原则。数不必作任何修改,这符合结构化程序设计方法的原则。C语语言言程程序序设设计计第第九九章章四川理工学院四川理工学院四川理工学院四川理工学院例例9.24main()intmax(int,int),min(int,int),add(int,int);inta,b;printf(“enteraandb

76、:”);scanf(“%d,%d”,&a,&b);printf(“max=”);process(a,b,max);printf(“min=”);process(a,b,min);printf(“sum=”);process(a,b,add);C语语言言程程序序设设计计第第九九章章四川理工学院四川理工学院四川理工学院四川理工学院max(intx,inty)intz;if(xy)z=x;elsez=y;return(z);min(intx,inty)intz;if(xy)z=x;elsez=y;return(z);C语语言言程程序序设设计计第第九九章章四川理工学院四川理工学院四川理工学院四川理工学

77、院add(intx,itny)intz;z=x+y;return(z);process(itnx,inty,int(*fun)(int,int)intresult;result=(*fun)(x,y);printf(“%dn”,result);max函数函数add函数函数min函数函数C语语言言程程序序设设计计第第九九章章四川理工学院四川理工学院四川理工学院四川理工学院运行结果运行结果:enteraandb:2,6 max=6min=2sum=8说明说明:main函数的第二行不能少。因为在用函数指针变量函数的第二行不能少。因为在用函数指针变量调用函数是用函数名作实参。为保证编译系统正确判调用函

78、数是用函数名作实参。为保证编译系统正确判别它是别它是函数名函数名,必须作说明。,必须作说明。C语语言言程程序序设设计计第第九九章章四川理工学院四川理工学院四川理工学院四川理工学院9.6返回指针值的函数返回指针值的函数一、一、定义定义格式格式:数据类型数据类型*函数名函数名(参数表参数表)函数体函数体如如:int*fun(int*x,inty).returnx;调用此函数能得到一个指向整型数据的指针调用此函数能得到一个指向整型数据的指针(地址地址)C语语言言程程序序设设计计第第九九章章四川理工学院四川理工学院四川理工学院四川理工学院#include“stdio.h”int*fun(int*x,i

79、ntn,inty)inti=0;for(;in;i+,x+)if(*x=y)returnx;returnNULL;main()inta6=4,5,2,6,10,8,*p,t;scanf(“%d”,&t);p=fun(a,6,t);printf(“%dn”,*p);运行时若输入运行时若输入8 则输出为则输出为C语语言言程程序序设设计计第第九九章章四川理工学院四川理工学院四川理工学院四川理工学院9.7指针数组和指向指针的指针指针数组和指向指针的指针一、指针数组的概念一、指针数组的概念由同一数据类型的指针变量构成的数组叫由同一数据类型的指针变量构成的数组叫指针数组指针数组。即一个数组的所有元素均为指

80、针型数据。即一个数组的所有元素均为指针型数据。定义格式定义格式:类型标识符类型标识符*数组名数组名数组长度数组长度如如:int*p4;即表示指针数组即表示指针数组p有四个元素。每一个元素都是指针有四个元素。每一个元素都是指针变量,且可以指向一个整型变量。指针数组的下标仍变量,且可以指向一个整型变量。指针数组的下标仍从从0开始计。开始计。例例9.27将若干个字符串按字母顺序将若干个字符串按字母顺序(由由小小到到大大)输出。输出。(也叫按也叫按字典顺序输出字典顺序输出)C语语言言程程序序设设计计第第九九章章四川理工学院四川理工学院四川理工学院四川理工学院 #include “string.h” m

81、ain ( ) void sort ( ) ; void print ( ) ; static char *name = “Follow me ”, “ BASIC ” , “Greatwall ”, “FORTRAN ”, “ Computer design ” ; int n = 5 ; sort ( name , n ) ; print ( name , n ) ; void sort (char *name , int n )name0name1name2name3name4Follow meBASICGreat wallFORTRANComputer designname 数组nam

82、e0name1name2name3name4Follow meBASICGreat wallname 数组FORTRANComputer C语语言言程程序序设设计计第第九九章章四川理工学院四川理工学院四川理工学院四川理工学院char*temp;inti,j,k;for(i=0;in1;i+)k=i;for(j=i+1;j0)k=j;if(k!=i)temp=namei;namei=namek;namek=temp;voidprint(char*name,intn)inti;for(i=0;in;i+)printf(“%sn”,namei);指针变量指针变量,表示字符串的首地址表示字符串的首地址

83、C语语言言程程序序设设计计第第九九章章四川理工学院四川理工学院四川理工学院四川理工学院运行结果运行结果:BASICComputerdesignFORTRANFollowmeGreatWall本例是通过改变指针数组中各元素的值,即字符串的首本例是通过改变指针数组中各元素的值,即字符串的首地址方式,在不改变字符串位置的情况下,达到排序的地址方式,在不改变字符串位置的情况下,达到排序的目的的。目的的。sort函数可改为函数可改为:C语语言言程程序序设设计计第第九九章章四川理工学院四川理工学院四川理工学院四川理工学院(1)voidsort(char*name,intn)char*temp;inti,j

84、;for(i=0;in 1;i+)for(j=i+1;j0)temp=namei;namei=namej;namej=temp;(2)voidsort(char*name,intn)chartemp81;inti,j;C语语言言程程序序设设计计第第九九章章四川理工学院四川理工学院四川理工学院四川理工学院for(i=0;in 1;i+)for(j=0;j0)strcpy(temp,namej);strcpy(namej,namej+1);strcpy(namej+1,temp);另外另外print函数也可改为函数也可改为:voidprint(char*name,intn)inti=0;char*

85、p;p=name0;while(in)C语语言言程程序序设设计计第第九九章章四川理工学院四川理工学院四川理工学院四川理工学院p=*(name+i+);printf(“%sn”,p);二、二、指向指针的指针指向指针的指针表示一个指向字符指针变量的指针变量。表示一个指向字符指针变量的指针变量。即即:p中只能存放一个指向字符型数据的指针变量的地址。中只能存放一个指向字符型数据的指针变量的地址。先求先求*(name+i)的值的值,即即namei。再使再使i自增自增。&pq&ap6a定义格式定义格式:数据类型数据类型*标识符标识符如:如:char*p;C语语言言程程序序设设计计第第九九章章四川理工学院四

86、川理工学院四川理工学院四川理工学院main()staticchar*name=“Followme”,“BASIC”,“Greatwall”,“FORTRAN”,“Computerdesign”;char*p;inti;for(i=0;i5;i+)p=name+i;表示表示namei的地址的地址printf(“%sn”,*p);运行结果运行结果:FollowmeBASICGreatWallFORTRANComputerdesignname0name1name2name3name4FollowmeBASICGreatwallFORTRANComputerdesignname数组数组C语语言言程程序

87、序设设计计第第九九章章四川理工学院四川理工学院四川理工学院四川理工学院说明说明:指针数组的元素也可以指向整型数据或实型数据。如指针数组的元素也可以指向整型数据或实型数据。如:例例9.29main()inta5=1,3,5,7,9;staticint*num5=&a0,&a1,&a2,&a3,&a4;int*p,i;p=num;for(i=0;i1)+argv;printf(“%sn”,*argv);argc;file 1 0C h in a 0B e ijing C语语言言程程序序设设计计第第九九章章四川理工学院四川理工学院四川理工学院四川理工学院若输入的命令行为若输入的命令行为:file1C

88、hinaBeijing 则输出为则输出为:ChinaBeijing上述程序也可改为上述程序也可改为:main(intargc,char*argv)while(argc1)printf(“%sn”,*+argv);先进行先进行+argv计算计算C语语言言程程序序设设计计第第九九章章四川理工学院四川理工学院四川理工学院四川理工学院又如具有又如具有“参数回送参数回送”功能的功能的C程序程序(假定源文件名为假定源文件名为echo.c)main(intargc,char*argv)while(argc0)printf(“%s%cn”,*+argv,(argc1)?:n);如输入命令行如输入命令行:ech

89、oComputerandCLanguage 则在显示屏上输出则在显示屏上输出:ComputerandCLanguage此程序也可改为此程序也可改为:C语语言言程程序序设设计计第第九九章章四川理工学院四川理工学院四川理工学院四川理工学院main(intargc,char*argv)inti;for(i=1;iargc;i+)printf(“%s%c”,argvi,(iargc1)?:n);C语语言言程程序序设设计计第第九九章章四川理工学院四川理工学院四川理工学院四川理工学院作业:作业:P P258 10.1 10.3 10.8 10.16 10.1710.1 10.3 10.8 10.16 C语

90、语言言程程序序设设计计第第九九章章四川理工学院四川理工学院四川理工学院四川理工学院9.8 有关指针的数据类型和指针运算的小结( 自学 )C语语言言程程序序设设计计第第九九章章四川理工学院四川理工学院四川理工学院四川理工学院9.9动态内存分配动态内存分配一、动态内存分配函数一、动态内存分配函数1.动态数据结构动态数据结构前述各种数组,其元素在内存中存储时占用连续的内前述各种数组,其元素在内存中存储时占用连续的内存空间。存空间。所占据内存空间的位置和大小是在数组被定义所占据内存空间的位置和大小是在数组被定义说明的同时由系统分配的,且在程序运行期间不改变。说明的同时由系统分配的,且在程序运行期间不改

91、变。这种数据结构叫这种数据结构叫“静态数据结构静态数据结构”。若数据所占用的若数据所占用的内内存空间的位置和大小随程序的运行而动态变化,则这种存空间的位置和大小随程序的运行而动态变化,则这种数据结构叫数据结构叫“动态数据结构动态数据结构”。其特点是。其特点是:各数据在各数据在逻逻辑辑上上是连续排列的。但在是连续排列的。但在物理上物理上并不真正连续。即在内存并不真正连续。即在内存中存储时并不占用连续的内存空间。中存储时并不占用连续的内存空间。C语语言言程程序序设设计计第第九九章章四川理工学院四川理工学院四川理工学院四川理工学院2.动态内存分配函数动态内存分配函数(1)malloc函数函数作用作用

92、:为数据为数据动态分配动态分配内存单元内存单元格式格式:void*malloc(size)说明说明:a.参数参数size表示要求分配的内存空间表示要求分配的内存空间字节数字节数。即调用本函数时,它在内存中分配大小为即调用本函数时,它在内存中分配大小为size字节字节的空间。的空间。b.调用本函数,正常时该函数返回所分配内存单元调用本函数,正常时该函数返回所分配内存单元的的起始地址起始地址。如内存中已没有足够的空间,则返。如内存中已没有足够的空间,则返回零回零(NULL),即返回即返回空指针空指针。c.由于由于malloc函数的返回值是函数的返回值是void型的指针。因型的指针。因此在把返回值赋

93、给具有一定数据类型的指针变量此在把返回值赋给具有一定数据类型的指针变量时,应该对返回值实行强制类型转换。时,应该对返回值实行强制类型转换。C语语言言程程序序设设计计第第九九章章四川理工学院四川理工学院四川理工学院四川理工学院d.调用调用malloc函数,应在源程序开头用函数,应在源程序开头用:#include“malloc.h”(TurboC中为中为:alloc.h)例例:在内存中为在内存中为80个字符动态分配内存个字符动态分配内存#include“alloc.h”main()char*p;p=(char*)malloc(80*sizeof(char);if(p=0)printf(“outof

94、memoryn”);exit(0);其中其中:malloc()的返值用的返值用(char*)强制转换为字符型强制转换为字符型指指针。针。用用sizeof函数测试数据类型的大小。函数测试数据类型的大小。C语语言言程程序序设设计计第第九九章章四川理工学院四川理工学院四川理工学院四川理工学院(2)free()函数函数作用作用:用于用于释放释放malloc函数分配的内存空间函数分配的内存空间.格式格式:voidfree(p)说明说明:1.p为指针变量。为指针变量。调用该函数,则把调用该函数,则把p所指向的内所指向的内存空间释放,被释放的空间可以重新分配。存空间释放,被释放的空间可以重新分配。2.p所指

95、向的必须是在此之前使用所指向的必须是在此之前使用malloc函数分配函数分配的内存空间。而被释放的空间大小,则由使用的内存空间。而被释放的空间大小,则由使用malloc函数时参数函数时参数size决定。决定。3.只有调用只有调用malloc函数时分配的内存空间才能用函数时分配的内存空间才能用free函数释放。否则,可能会导致错误。函数释放。否则,可能会导致错误。C语语言言程程序序设设计计第第九九章章四川理工学院四川理工学院四川理工学院四川理工学院例例:为为40个个int数据动态分配空间并赋值和输出。数据动态分配空间并赋值和输出。#include“stdio.h”#include“alloc.h”main()inti,*p;p=(int*)malloc(40*sizeof(int);if(p=NULL)printf(“outofmemoryn”);exit(0);for(i=0;i40;i+)*(p+i)=i;for(i=0;i40;i+)printf(“%d”,*(p+i);free(p);C语语言言程程序序设设计计第第九九章章四川理工学院四川理工学院四川理工学院四川理工学院

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 办公文档 > 工作计划

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号