函数指针:
指向该函数的指针
首先区别一下函数名与数组名的区别:
#include <stdio.h> int Add(int x, int y) { return x + y; } int main() { printf("%p\n", &Add); printf("%p\n", Add); return 0; }
根据以上代码得出
- 数组名 != &数组名
- 函数名 = &函数名
这里简单的测试下
#include <stdio.h> int Add(int x, int y) { return x + y; } int main() { int a = 10; int b = 10; Add(a, b); int (*pf)(int, int) = Add;//pf====Add int ret = pf(3, 5); printf("%d\n", ret);return 0; }
一些特殊代码的解读
1.
(*( void(*)())0)();
- 调用0地址处的函数
- 该函数无参,返回类型是void
- void(*)()--函数指针类形
- .(void(*)())0--对0进行强制类型转换,被解释为一个函数的地址
- *(void(*)())0--对0地址进行了解引用操作
- (*(void(*)())0)()--调用了地址处的函数
//--<<c陷阱和缺陷>>
2.
void (*signal(int, void(*)(int)))(int);
- signal和()先结合,说明signal是函数名
- signal函数的第一个参数的类形是int,第二个的类形是函数指针该函数指针,指向一个参数为int,返回类形是void的函数
- signal函数的返回类型也是一个函数指针,该函数指针,指向一个参数为int,返回类形是void的函数
代码优化
typedef void(*pfun_t)(int);//对void(*)(int)的函数指针类形重命名为pfun_t pfun_t signal(int, pfun_t);
标签:函数,int,signal,Add,函数指针,void From: https://www.cnblogs.com/qiyuancc/p/16989666.html