【C语法陷阱】:怎样理解(*(void(*)())0)()


首先我们回忆一下C语言中变量是怎样声明的?任何C语言的变量声明都由两部分组成:类型、变量名(声明符)。
例如:int a,b;

接下来我们试着声明一个函数:
float  g( );  这个声明的含义是g是一个返回值为浮点类型的函数。

然后,我们在声明一个指针:
float *pf;  这个声明的含义是pf是一个指向浮点数的指针


★现在,我们分两步分析表达式(*(void(*)())0)().

①假设变量fp是一个函数指针,用(*fp)( );调用函数,因为fp是一个函数指针,*fp就是指针所指向的函数,所以(*fp)( );就可以调用该函数。
②函 数运算符()的优先级高于单目运算符*。假设fp是指向一个无返回值类型的指针,调用它的方式为void (*fp)( ),此时fp变量的类型是void(*)( ),然后将常数0强制类型转换为(void(*fp)( ))0。因此,我们可以用void(*fp)( ))0代替fp,调用函数就是(void(*fp)( ))0)();
注:变量的类型就是把变量名去掉剩下的东西

 ●我们可以用typedef换一下上述表达式的类型名
 例如:typedef  void (*ff)( );因此, 调用函数的方式可以写成:(*(ff)0) ( );

猜你喜欢

转载自blog.csdn.net/hansionz/article/details/79977086