带你剖析 (*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的位置执行程序。

在此,放一份例程帮助大家更好地理解。结果是终端输出两个OK。

#include <stdio.h>
#include <stdlib.h>
typedef void(*pF)(void);

char fun(void)
{
	printf("OK\r\n");
}
int main(int argc ,char **argv)
{
	pF Fun= fun; //定义函数指针Fun指向函数fun
	(*Fun)();  //正式调用
	Fun(); //简写调用
	system("pause");
	return 0;
}

如果你看懂了这篇文章,那你知道下面这句话中两个void代表的意义吗?思考无果的可以私信哟。

typedef void (*pF)(void);

Tags:
3,648 Comments