函数指针
函数指针是指向函数的指针变量。 因此“函数指针”本身首先应是指针变量,只不过该指针变量指向函数。这正如用指针变量可指向整型变量、字符型、数组一样,这里是指向函数。如前所述,C在编译时,每一个函数都有一个入口地址,该入口地址就是函数指针所指向的地址。有了指向函数的指针变量后,可用该指针变量调用函数,就如同用指针变量可引用其他类型变量一样,在这些概念上是大体一致的。
函数指针有两个用途:调用函数和做函数的参数。
用c语言测试
0x01 一个简单的demo
1 2 3 4 5 6 7 8 9 10 11 12 |
#include<stdio.h> int max(int a1,int a2){ return a1>a2?a1:a2; } int main(){ int (*pmax)(int,int)=max; printf("%d",pmax(1,2)); return 0; } |
输出结果
可以看到我们可以把函数当做变量来赋值给一个我们定义的指针,在我们编译c程序时,他的方法也自然编译到内存中 这段存储空间的首地址称为这个函数的地址 既然是地址我们就能定义一个地址来存放这个指针就是指向这个函数的指针。
定义的方法也就是函数返回值类型 (* 指针变量名) (函数参数列表);
0x02 扩展写法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
#include<stdio.h> int max(int a1,int a2){ return a1>a2?a1:a2; } int min(int a1,int a2){ return a1>a2?a2:a1; } int main(){ int (*pmax[])(int,int)={max,min}; printf("%d\n",pmax[0](1,2)); printf("%d",pmax[1](1,2)); return 0; } |
输出结果
我们甚至可以定义一个数组来存放具有相同返回值和相同参数的函数(ps:自我感觉有点类似于js的解构操作)
0x03 当函数参数为各种类型的指针时
1 2 3 4 5 6 7 8 9 |
void ptest(void *p){ printf("%d",*(int *)p); //这里必须把p指针转换类型 不然void类型的指针是无法输出的 } int main(){ void (* lis)(void *) = ptest; int s = 5; lis(&s); return 0; } |
也只是需要在创建函数指针时写成指针的形式就行了
没有返回值 或 参数为指针都是可以的
发表评论