在学习函数定义时,大家知道一个函数分为函数头和函数体,其中函数头包括返回值、函数名和参数表,那指针与函数是什么关系?
void sum(int a,int b);//void 是返回值,sum是函数名,int a和int b是函数参数
指针可替代函数头中的每一部分,也就是指针与函数有三重关系:指针作为函数参数,指针作为函数返回值,指向函数的指针。
一、指针作为函数参数
在第三节课里说过,指针的主要用途就是作为函数参数,当函数参数为普通变量时,函数参数的传递是值传递,而当函数参数是指针时,依然是值传递,只是这时的值是地址,通过地址可以访问到函数外的变量的值,有些书上也称指针作为函数参数为双向传递。具体例子可参考第三节课大纲。
二、指针作为函数返回值
函数的返回值可以是整形的,也可以是double等,那么也可以是指针类型的。如果函数返回一个int类型数据,那么返回值写为int就可以,相应的如果返回一个int类型的指针,返回值则是int *类型。
int i; int sum(int a); 返回整型类型 int *p; int *sum(int a); 返回指针类型
举例说明,以指针返回值的形式输出两个数中比较大的值,通过整形数据可以将最大值返回给main,也可以通过指针返回回来:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include<stdio.h> 2 int *max(int *p1,int *p2){ 3 int *r; 4 if(*p1>*p2) r=p1; 5 else r=p2; 6 7 return r; 8 } 9 10 int main(){ 11 int a,b,*p; 12 printf("input a and b: "); 13 scanf("%d,%d",&a,&b); 14 p=max(&a,&b); 15 printf("max=%d",*p); 16 17 return 0; 18 19 }
三、函数指针
编辑器对程序进行编译时,会为每个函数分配一片连续的内存空间,例如下图的main函数和swap函数,函数所在内存空间的首地址就是函数的入口地址:
那么这个入口地址也可以存放在一个指针类型的变量中,也就是使用一个指针变量指向该函数。然后像数组一样,该指针变量代替函数名来代替这个函数,指向函数的指针称为函数指针。函数指针的定义方式如下:
类型说明符 (*变量名)() 例如:int (*p)(char a); //定义了一个指向函数的指针变量p,函数的返回值是int,函数参数是char a。
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
由于外出培训,找其他老师代课,第六次课主要讲授了指针和二维数组、作为函数返回值的指针。指向函数的指针作为自学内容。