首先我们回忆一下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) ( );