函数声明与函数指针
在第一章中,编译器是从左向右读字符,读完字符之后要根据优先级等等进行思考,在看到函数声明的时候,首先会找到函数名,然后看优先级
float f;//f是一个浮点数
float fg();//fg()是一个浮点数
float *fg;// *fg是一个浮点数,fg是指向浮点数的指针
float *fg();//根据符号优先级()> *,*fg()是一个浮点数,fg()是指向浮点数的指针,也是说,fg()的返回值是指向浮点数的指针
float (*fg)();//找到fg→*fg是个指针,然后旁边是个(),那么这个指针就指向了函数,并且这个函数返回的是float
解析 (*(void(*)( ))0)();
请说明 (*(void(*)( ))0)();如果你不能理解,就往下看
往下看:逐层拆解
第一步:认出核心类型
void(*)( )* → 是一个指针
( ) → 指向的函数,参数为空
void → 返回 void
void(*)( )= 指向”无参、返回 void 的函数”的指针类型
第二步:把整数 0 强转为该类型
(void(*)( ))0把内存地址
0x0000强制解释为一个函数指针
第三步:用 * 解引用
*(void(*)( ))0拿到地址 0 处函数的本体
第四步:加括号调用
(*(void(*)( ))0)( )调用位于内存地址
0的函数
等价的简洁写法
typedef void (*FuncPtr)(void);
((FuncPtr)0)(); // 效果完全相同