函数声明与函数指针

← 返回 MOC


在第一章中,编译器是从左向右读字符,读完字符之后要根据优先级等等进行思考,在看到函数声明的时候,首先会找到函数名,然后看优先级

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)();     // 效果完全相同