函数指针
函数指针:
指向该函数的指针
首先区别一下函数名与数组名的区别:
copy
#include <stdio.h> int Add(int x, int y) { return x + y; } int main() { printf("%p\n", &Add); printf("%p\n", Add); return 0; }
根据以上代码得出
- 数组名 != &数组名
- 函数名 = &函数名
这里简单的测试下
copy
#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.
copy
(*( void(*)())0)();
- 调用0地址处的函数
- 该函数无参,返回类型是void
- void(*)()--函数指针类形
- .(void(*)())0--对0进行强制类型转换,被解释为一个函数的地址
- *(void(*)())0--对0地址进行了解引用操作
- (*(void(*)())0)()--调用了地址处的函数
//--<<c陷阱和缺陷>>
2.
copy
void (*signal(int, void(*)(int)))(int);
- signal和()先结合,说明signal是函数名
- signal函数的第一个参数的类形是int,第二个的类形是函数指针该函数指针,指向一个参数为int,返回类形是void的函数
- signal函数的返回类型也是一个函数指针,该函数指针,指向一个参数为int,返回类形是void的函数
代码优化
copy
typedef void(*pfun_t)(int);//对void(*)(int)的函数指针类形重命名为pfun_t pfun_t signal(int, pfun_t);
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】