带你剖析 (*void(*)()0)()

(*(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);

声明:本内容为作者独立观点,不代表电子星球立场。未经允许不得转载。授权事宜与稿件投诉,请联系:editor@netbroad.com
觉得内容不错的朋友,别忘了一键三连哦!
赞 1
收藏 2
关注 17
成为作者 赚取收益
全部留言
0/200
成为第一个和作者交流的人吧