C语言中函数指针
一.如何使用
如下所示,这是一个简单的案例。
#include<stdio.h>
void print(){
printf("我被执行了!!!\n");
}
int main(){
// 定义一个函数指针
void (*p1)() = print;
void (*p2)() = &print;
p1();
(*p2)();
return 0;
}
以上的代码首先是先定义一个函数指针通过 void (*[指针的名字])()
定义了一个函数指针,再将需要指向的函数的地址给到这个指针,最后通过使用 [指针的名字]()
or (*[指针的名字])()
,两者都是可以的。
二.回调函数
函数指针经常被使用在回调函数中,因为特有的性质,函数指针可以被视作参数传递给函数,如下是一个简单的例子。
#include<stdio.h>
void print(){
printf("我被执行了!!!\n");
}
void test(void (*p)()){
p();
printf("test the function\n");
}
int main(){
// 定义一个函数指针
void (*p1)() = print;
test(p1);
return 0;
}
当然这是一个比较简单的例子,我们可以尝试让传递的指针更加复杂。
#include<stdio.h>
void test2(int (*s)(int ,int ),int a,int b){
printf("s = %d\n",s(a,b));
}
int sum(int a, int b){
return a+b;
}
int main(){
// 定义一个函数指针
int (*s)(int ,int ) = sum;
test2(s,1,2);
return 0;
}
我们可以发现,通过这种方式定义指针特别麻烦,无论是在定义指针,还是在定义函数的形式参数时,遇到比较复杂的函数指针,代码就会显得不够优雅,为了解决这个问题就需要使用 typedef
关键字来定义别名
三.typedef 在函数指针中的使用
首先声明一个别名,如下。
typedef int (*PP)(int,int);
定义好后,我们就可以开始使用了
#include<stdio.h>
typedef int (*PP)(int,int);
void test2(int (*s)(int ,int ),int a,int b){
printf("num = %d\n",s(a,b));
}
int sum(int a, int b){
return a+b;
}
int main(){
// 定义一个函数指针
int (*s)(int ,int ) = sum;
PP p= sum;
test2(p,1,1);
test2(s,1,2);
return 0;
}
可以看到一样的效果,不仅代码的可读性增加了,也更加简洁了。