当在编写函数的时候,存在需要将某一函数作为参数传递到另外一个函数中需求。以下将会讲述实现这一需求的方法。
例如:在函数void function()中,需要将另外一个函数double input()的函数名作为参数。
定义函数input()的函数指针
定义函数指针的方法
函数名和数组名一样,都是代表了函数所在内存块的首地址。所以我们不难得出,通过函数名可以访问函数所在的内存区域中的数据。
所以这就给了函数指针的可行性。我们可以通过一个指针来存储一个函数所在的地址,即通过指针来访问一个函数名所指向的函数。
同时,C语言提供了函数指针变量,定义的方式如下:
// 定义函数指针 返回数据类型 (*函数指针变量名)(形参列表) // 对比定义函数 返回数据类型 函数名(形参列表)
定义了函数指针变量之后,就可以通过函数名把函数的地址赋值给函数指针了(通过普通的赋值语句即可)。
在复制完毕之后,就可以通过函数指针来调用整个函数了,调用的方法如下:
- 函数指针变量(实参列表)
- (*函数指针变量名)(实参列表)
// 假设函数为func() void (*pfunc)(int) // 第一种方法 pfunc(100); // 第二种方法 (*pfunc)(100);
此外,需要注意的是,我们可以把一个int类型的变量赋值给int类型的指针,但是不可以将其赋值给double类型的指针。
所以我们不难得出,使用函数指针能够接收的变量,他们定义的函数返回数据类型和形参列表必须一致。此时,就如同变量与指针变量类型一致的时候,才可以把变量的地址赋值给指针变量一样。
// 以下是代码示例
#include<stdio.h>
void func(double a){
printf("in func, a = %d\n", a);
}
int main(){
void (*pfunc)(int);
pfunc = func;
pfunc(100);
(*pfunc)(30);
return 0;
}
// 以下是编译结果
warning: assignment from incompatible pointer type
定义示例中的函数指针
typedef double (*P)(int);
调用函数
由于之前以及定义了input()函数的函数指针P,所以我们可以把该函数作为函数的参数。
定义一个函数void function(P input),调用function(input)即可。
#include<stdio.h>
typedef void (*P)(int);
void print(int n) {
print("%d\n", n);
}
// 写法1
void fun(int n, void (*show)(int)) {
int i;
for(i = 0; i < n; i++){
show(i);
}
}
// 写法2
void fun(int n, P show(int)){
......
}
int main() {
fun(10, print);
return 0;
}