本文内容摘自《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型的函数的地址,并执行该函数