本文内容摘自《C陷阱与缺陷》
考虑下面的语句:
(*(void*)()0)();
任何C变量的声明都由两部分组成,类型以及一组类似表达式的声明符。声明符从表面上看与表达式有些类似,对它求值应该返回一个生命中给定类型的结果。
先从最简单的声明开始分析:
float f;
可理解为表达式f的求值结果是float型的,即f是float型变量
float f();
可理解为函数f()的返回值是float型的,即f是返回值为float的函数
float *p;
可理解为*p是float型的,即p是指向float型的指针
float *g();
可理解为g()返回值是float型的指针,即g是返回值为float型指针的函数
float (*h)();
可理解为*h是返回值为float型的函数,即h是指向“返回值为float类型的函数”的指针
因此,声明:
void (*f)();
表示指针f是指向返回值为void型的函数的指针
表达式
(void (*)())0;
或者
(f)0
表示将0转换为“指向返回值为void的函数的指针”类型
表达式
(*(void*)()0)();
或者
(*(f)0)();
表示将常数0转换为返回值为void型的函数的地址,并执行该函数