《10 [兼容模式].pdf》由会员分享,可在线阅读,更多相关《10 [兼容模式].pdf(32页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第十章第十章 指针指针第十章第十章 指针指针?10.1 地址和指针的概念10.1 地址和指针的概念?10.2 变量的指针和指向变量的指针变量10.2 变量的指针和指向变量的指针变量?10.310.3 数组的指针和指向数组的指针变量数组的指针和指向数组的指针变量?10.310.3 数组的指针和指向数组的指针变量数组的指针和指向数组的指针变量?10.4 字符串的指针和指向字符串的指针变量10.4 字符串的指针和指向字符串的指针变量10 510 5 函数的指针和指向函数的指针函数的指针和指向函数的指针?1010.5 5 函数的指针和指向函数的指针函数的指针和指向函数的指针?10.6 返回指针值的函数
2、10.6 返回指针值的函数10 1 地址和指针的概念地址和指针的概念10.1 地址和指针的概念地址和指针的概念一一.地址与指针地址与指针1.地址与取地址运算地址与取地址运算C程序中的变量在内存中占有一个可标识的存储区程序中的变量在内存中占有一个可标识的存储区,每一个存储区是由若干个字节组成每一个存储区是由若干个字节组成,每一个字节都有自己的地址每一个字节都有自己的地址,而一个存储区的 地址是指该存储区中而一个存储区的 地址是指该存储区中,第一个字节的地址第一个字节的地址C语言允许在程序中使用变量的地址语言允许在程序中使用变量的地址(通过通过地址运算符地址运算符&可得到可得到)如如:float
3、x;变量变量 x 的地址的地址-&x int a10;数组变量数组变量 a 的地址的地址-数组名数组名 a 2.指针与指针变量指针与指针变量(1)变量的访问方式变量的访问方式(1)变量的访问方式变量的访问方式 直接访问 直接访问:通过变量名或地址访问变量的存储区通过变量名或地址访问变量的存储区例例:scanf(“%d”&x);例例:scanf(“%d”,&x);x=sqrt(x);printf(“%d”x);printf(%d ,x);间接访问 间接访问:将一个变量的地址存放在另一个变量中将一个变量的地址存放在另一个变量中如将变量如将变量的地址存放在的地址存放在20121010如将变量如将变量
4、 x 的地址存放在的地址存放在变量变量p 中中,访问访问x 时先找到时先找到p,再由再由p 中存放的地址找到中存放的地址找到 x201210101010再由再由p 中存放的地址找到中存放的地址找到 xpx(2)指针指针:一个一个变量的指针就是该变量的地址变量的指针就是该变量的地址(指针就是地址指针就是地址)变变如如变变量量x的指针为的指针为1010。(3)指针变量指针变量:存放某个变量的地址的变量存放某个变量的地址的变量,它用来指向另一它用来指向另一个变量。如个变量。如p10.2 变量的指针和指向变量的指针变量变量的指针和指向变量的指针变量一一、指针变量的定义指针变量的定义、指针变量的定义指针
5、变量的定义1.格式格式:数据类型数据类型*指针变量名指针变量名;例例int *p1;例例p;char *p2;2.说明说明:2.说明说明:(1)在变量定义时在变量定义时,*号表示该变量是指针变量号表示该变量是指针变量(注意注意:指针变量是指针变量是p1,p2,不是不是*p1,*p2)(p,p,p,p)(2)定义指针变量后定义指针变量后,系统为其分配存储空间系统为其分配存储空间,用以存放其他变量的地址用以存放其他变量的地址,但在对指针变量赋值前但在对指针变量赋值前,它并没有它并没有确定的值确定的值,也不指向一个确定的变量也不指向一个确定的变量例例:int x,*p;20121010px=5;px
6、51234注注:指针变量指针变量p的值是随机值的值是随机值,p注注 指针变量指针变量p的值是随机值的值是随机值,此时此时p 和和 x 并无关联并无关联(3)使指针变量指向一个确定的变量必须进行赋值使指针变量指向一个确定的变量必须进行赋值int x,*p;20121010 x=5;p=&x;px51010p二二指针变量的引用指针变量的引用二二、指针变量的引用指针变量的引用1.指针运算符指针运算符*(1)p与与*p不同不同 p是指针变量是指针变量 p的值是的值是p所指向的变量的地址所指向的变量的地址(1)p与与 p不同不同,p是指针变量是指针变量,p的值是的值是p所指向的变量的地址所指向的变量的地
7、址*p 是是p 所指向的变量所指向的变量,*p的值是的值是p所指向的变量的值所指向的变量的值*p 的值为的值为 5 (*p 表示表示 x),而而p 的值为的值为 1010(2)引用指针变量时的引用指针变量时的*与与 定义指针变量时的定义指针变量时的*不同不同(2)引用指针变量时的引用指针变量时的*与与 定义指针变量时的定义指针变量时的*不同不同定义变量时的定义变量时的*只是表示其后的变量只是表示其后的变量p是指针变量;是指针变量;引用时引用时*表示取指针变量表示取指针变量 所指向的变量所指向的变量 的值的值引用时引用时*表示取指针变量表示取指针变量p所指向的变量所指向的变量x的值的值。2012
8、1010int a,*p;p=&a;pa5101012让让p指向指向ap=&a;scanf(“%d”,p);printf(“%dn”,*p);pa等价等价于于&ap(%,p);*p=12;printf(“%dn”,*p);对对a 重新赋值重新赋值等价于等价于等价等价等价于等价于 a=122.&与与*p=&a;p&a;*&a?*(&a)?*p?a&*p?&(*p)?&a由于由于&和和*运算符优先级相等,所以按照从右运算符优先级相等,所以按照从右到左的顺序进行结合运算到左的顺序进行结合运算到左的顺序进行结合运算到左的顺序进行结合运算。3.*与与+,-int a=2,b=5,c,d,*p;20121
9、0102ab5,p;p1010(1)p=&a;(*p)+;(等价于等价于 a+;)101210143bc5p 的值为的值为a 的地址的地址,*p 的值为的值为2(p)+;(等价于等价于 a+;)3d语句执行之后语句执行之后p 的值不变的值不变,*p 的值为的值为 3(2)c=*p+;3等价于等价于c=*p;p+;执行后执行后 c 的值为的值为 3,*p 的值为的值为 5关于关于*p+的说明:由于的说明:由于*和和+运算符的优先级一样,遵从从运算符的优先级一样,遵从从右到右到左左的顺序的顺序,所以等价于所以等价于执行后执行后 c 的值为的值为 3 ,p 的值为的值为 5(3)d=*+p;右到的顺
10、序右到的顺序所以等价于所以等价于*(p+)。由于。由于+在在p的后面,则先操作后加一,所以写成的后面,则先操作后加一,所以写成c*p;p+;等价于等价于+p;d=*p;执行后执行后 d 的值为的值为 3,*p 的值为的值为 3=*p;p+;由于由于p的数据类型为的数据类型为int所以所以p+等价于等价于p=p+2参看课本参看课本pp+等价于等价于p p+2。参看课本参看课本P212 第二自然段的说明。第二自然段的说明。例例10.2输入输入a和和b两个整数,按先大后小的顺序输出两个整数,按先大后小的顺序输出a和和b。ap1&a&b5#include void main()int*p1*p2*p
11、a b;bpp2&b&a59 int p1,p2,p,a,b;scanf(“%d%d”,&a,&b);p1=&a;p2=&b;bp&a9p;p;if(ab)p=p1;12p&a输出结果输出结果:p1=p2;p2=p;a=5,b=9max=9,min=5printf(“a=%d,b=%d n”,a,b);printf(“max=%d,min=%d n”,*p1,*p2);p(,p,p);本程序的目的是本程序的目的是实现在指针变量实现在指针变量p1中存放值较大的中存放值较大的本程序的目的是本程序的目的是:实现在指针变量实现在指针变量p1中存放值较大的中存放值较大的变量的地址;变量的地址;p2中存放
12、值较小的变量的地址。中存放值较小的变量的地址。三、指针变量作函数参数三、指针变量作函数参数例例:2个数按大小顺序输出个数按大小顺序输出mainswap例例:2个数按大小顺序输出个数按大小顺序输出(整型变量做参数)整型变量做参数)#include ax559void swap(int x,int y)int temp;by995 int temp;temp=x;x=y;temp5说明说明:该程序不能实现该程序不能实现a和和by=temp;说明说明:该程序不能实现该程序不能实现a 和和b 的交换因为实参的交换因为实参a,b对形参对形参x,y是“值传递”是“值传递”,x 和和y的的变变void ma
13、in()int a,b;scanf(“%d%d”&a&b);yy变变化不影响化不影响a 和和b所以输出为所以输出为:a=5,b=9scanf(“%d%d”,&a,&b);if (ab)swap(a,b);printf(“a=%d,b=%dn”,a,b);,例例 10.3(指针变量做参数指针变量做参数)p1&t1mainswap1&(指针变量做参数指针变量做参数)#include void swap1(int *p1,int *p2)p1&apt1&a int temp;temp=*p1;*1*2a59*p1=*p2;*p2=temp;/*交换的是指针变交换的是指针变量指向的变量的值量指向的变量
14、的值*/p2&bpt2&b量指向的变量的值量指向的变量的值/void main()btemp5说明说明:这种方法是交换这种方法是交换p1和和95 int a,b,*pt1,*pt2;scanf(“%d%d”,&a,&b);t1&t2&b说明说明:这种方法是交换这种方法是交换p1和和p2所指向的变量的值所指向的变量的值,即即交换交换main函数中函数中a和和b的值的值pt1=&a;pt2=&b;if(ab)swap1(pt1,pt2);printf(“a=%d,b=%dn”,a,b);交换交换main函数中函数中a 和和b的值的值所以输出为所以输出为:a=9,b=5printf(a%d,b%dn
15、,a,b);例例 10.3#include 变参数变参数t1main&p1&swap2(指针(指针变变量做参量做参数数)void swap2(int *p1,int *p2)int*temp;pt1&ap1&a int*temp;*temp=*p1;*p1=*p2;a59pp;*p2=*temp;pt2&bp2&b说明说明:这种方法可以实现将这种方法可以实现将a,b的值互的值互换换但是可能会破坏系统的正常工作但是可能会破坏系统的正常工作btemp随机值随机值95换换,但是可能会破坏系统的正常工作但是可能会破坏系统的正常工作状态,因为状态,因为temp是一个指针变量但是是一个指针变量但是?5在函
16、数中并没有给在函数中并没有给temp一个确定的地一个确定的地址,这样它所指向的内存单元是不可预见的址,这样它所指向的内存单元是不可预见的,而对,而对*temp的赋值可能带来的赋值可能带来危害危害例例 10.3#include p1&at1main&bswap3(指针变量做参数)(指针变量做参数)void swap3(int *p1,int *p2)p1&a&apt1&b int *p;p=p1;12p2&b5a&bpt2&ap1=p2;p2=p;/*交换的是指针变交换的是指针变量的值量的值*/p2&b&bpt2&a量的值量的值*/p&a9b这种方法不能实现将这种方法不能实现将a,b的值互换,因
17、为只交换形参的值互换,因为只交换形参p1和和p2的值的值,使它使它们们们们的指向发生改变的指向发生改变,但是但是main函数中函数中的的 和和b的值并没有进行交换所以输的值并没有进行交换所以输的的a和和b的值并没有进行交换所以输的值并没有进行交换所以输出为出为:a=5,b=910.3 数组的指针和指向数组的指针变量数组的指针和指向数组的指针变量指向维数组的指针和指针变量指向维数组的指针和指针变量一一.指向指向一一维数组的指针和指针变量维数组的指针和指针变量1.一维数组及元素的地址表示一维数组及元素的地址表示i t5 1 2 3 4 5 数组的地址数组的地址int a5=1,2,3,4,5 ;数
18、组的地址数组的地址:a 元素地址元素地址*aa0&a0a*(a+1)a1&a1a+1*(a+1)a1&a1a+1*(a+2)a2&a2a+2*(a+3)a3&a3a+3*(a+4)a4&a4a+4(a 4)a4&a4a 42.用指针变量引用数组元素用指针变量引用数组元素(1)定义指针变量定义指针变量int *p,a5=1,2,3,4,5 ;p=a;/*指针指针p的值为内存中数组的值为内存中数组a的起始单元的地址的起始单元的地址*/(2)引用数组元素引用数组元素下标法地址法指针法下标法地址法指针法第第k个元素个元素ak*(a+k)*(p+k)第第 个元素个元素()(p)第第k个元素的地址个元素的
19、地址&aka+k p+k注意注意:指针变量也可以加下标指针变量也可以加下标 pk 等价于等价于 ak 分别用三种方法输出数组元素分别用三种方法输出数组元素 其效率不同其效率不同 分别用三种方法输出数组元素分别用三种方法输出数组元素,其效率不同其效率不同,下标法与地址法的效率相同下标法与地址法的效率相同,指针法的效率较快指针法的效率较快 用指针变量访问数组元素时要注意下标是否越界用指针变量访问数组元素时要注意下标是否越界 用指针变量访问数组元素时要注意下标是否越界用指针变量访问数组元素时要注意下标是否越界例例:将数组将数组a中全部元素加中全部元素加1,再输出再输出a#include 1a2pvo
20、id main()int a5=1,3,5,7,9,*p,j;f(5)35a+1a+246for(p=a;pa+5;p+)printf(“%3d”,*p);/*按指针访问数组按指针访问数组*/79a+3a+4810可以用可以用p+但不能用但不能用a+printf(“n”);9a+410可以用可以用p+,但不能用但不能用a+因为因为a 代表数组的起始地址代表数组的起始地址它它是地址常量是地址常量,不能改变不能改变;for(j=0;j5;j+)aj=aj+1;/*按数组名和下标访问数组按数组名和下标访问数组*/它它是地址常量是地址常量,不能改变不能改变;而而p 是一个指针变量是一个指针变量for(
21、j=0;j5;j+)if(“%3”*(j)/*按指针访问数组按指针访问数组p=a;printf(“%3d”,*(p+j);/*按指针访问数组按指针访问数组*/变意它前值变意它前值printf(“n”);使用指针使用指针变变量时要注量时要注意它意它的当的当前值前值3.指向数组的指针变量作函数参数指向数组的指针变量作函数参数 实参和形参都用数组名 实参和形参都用数组名maininv1例例10.7 将数组将数组a中中n个整数按相反顺序存放个整数按相反顺序存放 a0a1x0 x11397#include a1a2x1x24 6void inv1(int x ,int n)int temp,i,j,m=
22、(n-1)/2;f(i 0ii+)a3a4x3x46743for(i=0;i=m;i+)j=n-1-i;temp=xi;xi=xj;xj=temp;a5 x59 1xi xj;xj temp;void main()void main()int i,a6=1,3,4,6,7,9;inv1(a,6);inv1(a,6);for(i=0;i6;i+)printf(“%3d”,ai);printf(“n”);例例10.7 实参用数组名实参用数组名,形参用指针变量形参用指针变量i2#include void inv2(int *x,int n)int temp,m=(n-1)/2;1ax6ninv2p,
23、();int *p,*i,*j;i=x;j=x+n-1;p=x+m;13a0a1ai972mtemp1a+1a+23 4p;for(;i=p;i+,j-)temp=*i;*i=*j;46 a2a+2p64temp13 4i和和j的指向会变化的指向会变化ij;*j=temp;void main()67a3a434i和和j的指向会变化的指向会变化,p的指向保持不变的指向保持不变void main()int i,a6=1,3,4,6,7,9;inv2(a,6);for(i=0;i6;i+)9a5a+5j1a+4a+3for(i 0;i6;i+)printf(“%3d”,ai);printf(“n”)
24、;例例10.7 实参和形参都用指针变量实参和形参都用指针变量#include id i3(i t*i t)例例10.7 实参用指针变量实参用指针变量,形参用数组名形参用数组名#il dvoid inv3(int *x,int n);void main()i t*6 1 3 4 6 7 9#include void inv4(int x ,int n);idi()实参为指实参为指实参为指实参为指 int *p,a6=1,3,4,6,7,9;p=a;inv3(p,6);f(6)void main()int *p,a6=1,3,4,6,7,9;p=a;实参为指实参为指针变量针变量p实参为指实参为指针
25、变量针变量pfor(p=a;pa+6;p+)printf(“%3d”,*p);printf(“n”);inv4(p,6);for(p=a;pa+6;p+)printf(“%3d”,*p);形参为指形参为指void inv3(int *x,int n)p(p)printf(“n”);形参为指形参为指针变量针变量x形参为数组名形参为数组名x int temp,m=(n-1)/2;int *p,*i,*j;i=x;j=x+n-1;p=x+m;void inv4(int x ,int n)int temp,i,j,m=(n-1)/2;for(i=0;i=m;i+);j;p;for(;i=p;i+,j-
26、)temp=*i;*i=*j;*j=temp;(;)j=n-1-i;temp=xi;xi=xj;xj=temp;jp;实参类型实参类型变量名数组名或指针变变量名数组名或指针变量量量量要求形参的类型要求形参的类型 变量名变量名数组名或指针变数组名或指针变要求形参的类型要求形参的类型 变量名变量名数组名或指针变数组名或指针变量量传递的信息传递的信息变量的值变量的值数组的起始地址数组的起始地址传递的信息传递的信息变量的值变量的值数组的起始地址数组的起始地址通过函数调用能否改变实参的值通过函数调用能否改变实参的值不能能不能能(值传递)(地址传递)(值传递)(地址传递)例例10.8 求数组中最大和最小元
27、素求数组中最大和最小元素主函数中定义数组主函数中定义数组a5,调用函数,调用函数中定义数组中定义数组5和指针变量和指针变量maina06n4aarr调用函数调用函数中定义数组中定义数组arr5和指针变量和指针变量p。最大值和最小值放在全局变量。最大值和最小值放在全局变量max和和min中。中。a12arr+1pmax714 7 9a2a3min194 1 0#include int max,min;void m1(int arr int n)/*形参为数组名形参为数组名*/a4a505void m1(int arr ,int n)/*形参为数组名形参为数组名*/int *p,*end;end=
28、arr+n;i*a5arr+6end5max=min=*arr;for(p=arr+1;pmax)max=*p;else if(*pmin)min=*p;void main()用指针变量用指针变量p 读取读取数组中的每数组中的每一一个值个值 int i,a6;for(i=0;i6;i+)scanf(“%d”,&ai);m1(a,6);/*实参为数组名实参为数组名*/数组中的每个值数组中的每个值与与max和和min相比较。相比较。(,);实参为数组名实参为数组名printf(“max=%d,min=%dn”,max,min);10.4 字符串的指针和指向字符串的指针变量字符串的指针和指向字符串的
29、指针变量一、字符指针一、字符指针1 定义定义指向字符串的指针变量指向字符串的指针变量Ch246024612460p1.定义定义指向字符串的指针变量指向字符串的指针变量char *p=“China”;说明说明:这里没有定义字符数组这里没有定义字符数组in24622463将字符串的将字符串的首地址赋给首地址赋给说明说明:这里没有定义字符数组这里没有定义字符数组,但字符串在内存中还是以数组但字符串在内存中还是以数组形式存放的形式存放的 字符串在内存中字符串在内存中na0246324642465首地址赋给首地址赋给p形式存放的形式存放的.字符串在内存中字符串在内存中占有一片连续的存储单元占有一片连续的
30、存储单元,以以0结束结束02465注意注意:赋值只是把字符串的首地址赋给赋值只是把字符串的首地址赋给p,而不是把字符串赋给而不是把字符串赋给 p,p 是一个指针变量是一个指针变量,p,p,它不能存放一个字符串它不能存放一个字符串,只能存放一个地址只能存放一个地址2.输出字符串输出字符串:printf(“%sn”,p);C24602460p24612462246324642465p(,p);输出字符串时输出字符串时,先输出先输出p 指向的指向的第第一一个字符个字符,然后系统自动执行然后系统自动执行p+,hi24612462第个字符第个字符,然后系统自动执行然后系统自动执行p,使使p 指向下一个字
31、符指向下一个字符,再输出该字符再输出该字符,直到遇到直到遇到0为止为止na24632464直到遇到直到遇到0 为止为止也可以用循环逐个输出字符串中的字符也可以用循环逐个输出字符串中的字符:for(;*p!=0;p+)a024642465for(;p!0;p)printf(“%c”,*p);字符数与字符变的字符数与字符变的二、二、字符数字符数组组与字符与字符指针指针变变量量的的区别区别char s =“C Language”;char *p=“C Language”;1.存储方式不同存储方式不同:s 存放的是字符串中的存放的是字符串中的字符和字符和0p 存放的是字符串的存放的是字符串的首地址首地
32、址p 存放的是字符串的存放的是字符串的首地址首地址2.虽然虽然s 和和p 都能代表字符串的首地址都能代表字符串的首地址,但但s是数组名是数组名,是个常量是个常量 而而 是个指针变量是个指针变量是是一一个常量个常量,而而p是是一一个指针变量个指针变量,因此因此 s+的 写法是错的的 写法是错的,而而p+的写法是对的的写法是对的3.赋值方式不同赋值方式不同s 可以进行初始化可以进行初始化p 既可以初始化既可以初始化,s 可以进行初始化可以进行初始化,但不能使用赋值语句但不能使用赋值语句p 既可以初始化既可以初始化,也可以赋值也可以赋值char *p1,*p2=“abcd”;p1=“China”;c
33、har s12,str =“good”;s12=“China”;p;s=“China”;错错4.定义数组定义数组s 时时,系统会给系统会给s 分配一片连续的存储单元定义指针变量分配一片连续的存储单元定义指针变量p 时时,只给只给p 分配一个存储单元分配一个存储单元三、字符串指针作函数参数三、字符串指针作函数参数例例10.20 实实现字符串复制现字符串复制.形参和形参和实实参都是数组名参都是数组名实实实实#include void copystr(char from ,char to)ab int i=0;while(fromi!=0)toi=fromi;ctifromatobc toi=fro
34、mi;i+;atigat相当于相当于bi=aitoi=0;idi()0er0相当于相当于bi=aivoid main()char a =“cat”,b =“tiger”;puts(a);puts(b);r0puts(a);puts(b);copystr(a,b);puts(a);puts(b);p();p();例例 10.20 实参和形参都是指针变量实参和形参都是指针变量void copystr(char*from,char *to)py(,)for(;*from!=0;from+,to+)*to=*from;ab;*to=0;catifromatobcaa+1b+1a+2b+2a+3b+3v
35、oid main()char*a=“cat”,*b=“tiger”;t0get0 char a cat ,b tiger;puts(a);puts(b);copystr(a b);0er0copystr(a,b);puts(a);puts(b);0 10 5 函数的指针和指向函数的指针变量函数的指针和指向函数的指针变量10.5 函数的指针和指向函数的指针变量函数的指针和指向函数的指针变量一、函数的指针一、函数的指针:函数的入口地址函数的入口地址在程序执行过程中调用函数时在程序执行过程中调用函数时,计算机会转去执行计算机会转去执行,函数体内的语句函数体内的语句,因此计算机必须知道函数在什么地方。
36、因此计算机必须知道函数在什么地方。实际实际上上函数在内存中函数在内存中也也要占据要占据一一片存储单元片存储单元,这这片存储片存储实际实际函数在内存中要占据片存储单元函数在内存中要占据片存储单元,片存储片存储单元一个起始地址单元一个起始地址,我们称其为我们称其为函数的入口地址函数的入口地址,即函数的指针即函数的指针,这个函数的入口地址是这个函数的入口地址是用函数名来表示用函数名来表示。即函数的指针即函数的指针,这个函数的入口地址是这个函数的入口地址是用函数名来表示用函数名来表示。因此我们可以定义一个指针变量因此我们可以定义一个指针变量,让它的值等于让它的值等于函数的入口地址函数的入口地址,然后可
37、以通过这个指针变量来调用然后可以通过这个指针变量来调用函数的入口地址函数的入口地址,然后可以通过这个指针变量来调用然后可以通过这个指针变量来调用函数函数,该指针变量称为指向函数的指针变量该指针变量称为指向函数的指针变量二二、指向函数的指针变量指向函数的指针变量二二、指向函数的指针变量指向函数的指针变量1.定义格式定义格式:数据类型数据类型(*指针变量名指针变量名)(形参表列形参表列);int (*pt)(int arr ,int n);(p)(,);说明说明:数据类型 数据类型:指针变量所指向的函数的返回值类型指针变量所指向的函数的返回值类型 形参表列 形参表列:即指针变量所指向的函数的形参表
38、列 格式中的小括号不能省略即指针变量所指向的函数的形参表列 格式中的小括号不能省略2.应用应用(1)让指针变量指向函数让指针变量指向函数pt=add;(1)让指针变量指向函数让指针变量指向函数pt=add;因为函数名为函数的入口地址因为函数名为函数的入口地址,所以直接将函数名所以直接将函数名赋给指针变量即可赋给指针变量即可赋给指针变量即可赋给指针变量即可(2)使用指针变量调用函数使用指针变量调用函数格式格式:(*指针变量名指针变量名)(实参表列实参表列)格式格式:(指针变量名指针变量名)(实参表列实参表列)例 求一维数组中全部元素的和例 求一维数组中全部元素的和#include int add
39、(int b ,int n);void main()void main()int a6=1,3,5,7,9,11,total;int (*pt)(int b ,int n);定义指向函数的指针变量定义指向函数的指针变量(p)(,);pt=add;total=(*pt)(a,6);令指针变量令指针变量pt 指向函数指向函数add通过通过pt 调用调用函数函数addprintf(“total=%d n”,total);int add(int b int n)函数函数addint add(int b ,int n)int i,sum=0;for(i=0;in;i+)(;)sum=sum+bi;ret
40、urn(sum);10.6 返回指针值的函数返回指针值的函数前面我们用到的函数前面我们用到的函数 有些无返回值有些无返回值 有些有返回值有些有返回值前面我们用到的函数前面我们用到的函数,有些无返回值有些无返回值,有些有返回值有些有返回值,返回值 类型多为返回值 类型多为 int,float,char.一个函数的返回值也一个函数的返回值也可以是个指针类型的数据可以是个指针类型的数据(即地址即地址)可以是可以是一一个指针类型的数据个指针类型的数据(即地址即地址)定义函数定义函数:数据类型数据类型*函数名函数名(形参表列形参表列)数体数体 函函数体数体;例例:int *fun(int a,int b
41、)函数体函数体;说明说明:定义一个返回指针值的函数与以前定义函数格式基本类似定义一个返回指针值的函数与以前定义函数格式基本类似,只是只是在函数名前加在函数名前加*,它表明该函数返回一个它表明该函数返回一个指针值指针值,而这个指针值是指向一个而这个指针值是指向一个 int 型数据型数据例例:习题习题10 19idi()例例:习题习题10.19#include#include void main()char*p1,*p2;int i;p1=alloc(10);g#define SIZE 100char bufSIZE;h*b fp1=alloc(10);strcpy(p1,”123456789”)
42、;p2=alloc(5);char *p=buf;char*alloc(int n)p2 alloc(5);strcpy(p2,”abcd”);printf(“buf=%pn”,buf);char alloc(int n)char *begin;if(p+n=buf+SIZE)printf(buf%pn,buf);printf(“p1=%pn”,p1);printf(“p2=%pn”,p2);begin=p;p=p+n;return(begin);p(pp,p);puts(p1);puts(p2);for(i=0;i15;i+)else return(NULL);printf(“%c”,bufi);buf0p1 buf1buf1:bufp buf+10main2:buf+15:buf9p2 buf+1090buf9buf100abi:buf14beginallocbuf:0beginallocbuf+10buf14buf15n alloc010n 5:buf99课后作业:课后作业:P25810 210 410 810.210.410.810 1510 1710.1510.17