(*(void)(*)()0)();
在此,您已经看到了这篇文章,不妨停留几分钟,思考如上表达式的意义何在?
如果思考无果,请继续看这边文章,接下来你会获得答案,你会发现原来也不过如此,就是纸老虎,一捅即破。
任何C变量的声明都由两部分组成:类型以及一组类似表达式的声明符(declarator)。声明符从表面上看与表达式有些类似,对它求值应该返回一个声明中给定类型的结果。如:
int *g() , (*h)() ;
表达式*g()与(*h)()是整形表达式。
因为()运算符优先级高于运算符*。*g()就等于*(g()):g是一个指针函数,是函数就有返回值,该函数的返回值类型为指向整形的指针。同理可以得出h是一个函数指针,h所指向的函数的返回值类型为整形。
如果概念模糊可参考:函数指针&&指针函数
如何来获得声明过后的类型呢,只需要把声明中的变量名和声明末尾的分号去掉,再将剩余的部分用一个圆括号来“封装”起来即可。
void (*h)();
h的类型为:void(*)(),表示一个“指向返回值类型为void类型的函数的指针”,这个类型是否看着眼熟,就是(*(void)(*)()0)();表达式中的一部分。(void)(*)()0代表将0强制类型转化成函数指针,暂且就用pF代替。
那么原式就可以简化为(*pF)();pF是一个函数指针,(*pF)就是该指针指向的函数名,函数名后面加一个括号(),(*pF)()就代表执行这个函数。(*pF)()也可以简写为pF();
(*(void)(*)()0)();就代表去地址为0的位置执行程序。
如果你看懂了这篇文章,那你知道下面这句话中两个void代表的意义吗?思考无果的可以私信哟。
typedef void (*pF)(void);