先来说一下函数指针的几种使用方式:
第一种,比如我们定义两个相加的函数,定义一个函数指针
语法 返回类型(* 起一个名字)(参数类型,。。。)
int add(int x,int y){
return x+y;
}
int main(){
int (*p_func)(int,int) = add;
int res = p_func(1,2);
printf("res = %d\n",res);
return 0;
}
第二种:
使用typedef定义一种函数指针类型,用它来定义一个指针变量。(这也是在很多C语言框架中北广泛使用的一种方式,在后面的回调函数也是使用这种方式)
int add(int x,int y){
return x+y;
}
typedef int(*P_FUNC)(int,int);
int main(){
P_FUNC func= add;
res = func(2,6);
printf("res = %d\n",res);
}
第三种、如果知道一个函数的地址,可以直接使用地址调用函数
ex:我们使用nm命令查到add函数的地址是0000000000401550,就可以直接使用这个地址就行调用函数,比如在嵌入式开发中调用uboot中的的printf函数,就可以这样使用。
p_func = (int(*)(int,int))0x0000000000401550;
res = p_func(1,3);
printf("res = %d\n",res);
第四种、可以直接使用地址来获取返回结果,其实个第三种类似。
res = ((int(*)(int,int))0x0000000000401550)(5,5);
printf("res = %d\n",res);
回调函数:
我们可以看到calc函数,需要一个返回值是int参数为int,int类型的函数,我们只需要自己实现这样的一个含函数,吧这个函数地址传进去,就可以进行自己的运算了。
#include <stdio.h>
typedef int(*p_func)(int,int);
int add(int x,int y){
return x+y;
}
int sub(int x,int y){
return x-y;
}
//做计算的函数
void calc(p_func func,int x,int y){
printf("res = %d\n",func(x,y));
}
int main(){
calc(add,8,4);
calc(sub,8,4);
return 0;
}