什么是函数指针,简单来看,其实它还是一个指针,只不过它指向一个函数,下面看一个简单的例子
1 #include<stdio.h> 2 int max(int x,int y) //定义一个函数用来返回两个数中较大的一个 3 { 4 return (x>y?x:y); 5 } 6 int main() 7 { 8 int (*ptr)(int x,int y); //定义一个函数指针,指向的函数返回值为int型,还有两个int型参数 9 int a,b,c; 10 ptr=max; //把max函数的地址赋给ptr这个函数指针 11 scanf("%d %d",&a,&b); 12 c=(*ptr)(a,b); //通过调用ptr这个函数指针来来调用max函数 13 printf("a=%d,b=%d,max=%d",a,b,c); 14 return 0; 15 }
其中第10行与ptr=&max 相同,函数名即为函数的地址,所以加不加&都可以。
第12行表示用一个函数指针去调用函数,还可以改为 c=ptr(a,b),这样表示直接用函数名去调用函数。
函数指针定义的时候要表明它指向函数的返回值的数据类型,还有参数个数以及各个参数的数据类型。
好了,了解什么是函数指针,再来看道题吧
1 #include<stdio.h> 2 int get_big(int i,int j) //一个求最大值的函数 3 { 4 return i>j?i:j; 5 } 6 int get_max(int i,int j,int k,int(*p)(int,int)) //这个函数有四个参数,其中一个为函数指针 7 { 8 int ret; 9 ret=p(i,j); //通过该指针调用get_big函数 10 ret=p(ret,k); 11 return ret; 12 } 13 int main() 14 { 15 int i=5,j=10,k=15,ret; 16 ret=get_max(i,j,k,get_big); //实参最后一个参数为函数名,传递给形参函数指针 17 printf("The max is %d",ret); 18 return 0; 19 }
函数指针还可以作为形参,当传递到一个函数内时,可以用该指针调用其他函数。
再看看其他例子
1 #include<stdio.h> 2 int get_big(int i,int j) //一个求最大值的函数 3 { 4 return i>j?i:j; 5 } 6 int (*get_function(int a))(int,int) 7 /*定义了一个get_function函数,该函数的返回值是一个函数指针,函数指针指向的函数返回值为int型,而且有两个int型参数*/ 8 { 9 printf("the number is %d ",a); 10 return get_big; 11 } 12 13 int main() 14 { 15 int i=5,j=10,max; 16 int (*p)(int,int); //定义函数指针 17 p=get_function(100); //将get_function的返回值赋给p这个函数指针 18 max=(*p)(i,j); //通过p调用get_big函数 19 printf("the max is %d",max); 20 return 0; 21 22 23 }
函数指针也可以作为一个函数的返回值的。
以上内容部分来自《linux c编程实战》这本书。