思考一条语句 (*(void(*)())0)();
首先,最简单的单个变量的声明,如float f,g;表示党对其求值时,表达式f和g的类型为浮点数类型,同理函数和指针类型的声明
float ff(); 表达式ff()求值结果是一个浮点数
float *p; *p是一个浮点数,也就是p是一个指向浮点数的指针。
将以上形式结合起来,分析下面两个声明:
float *f();
float (*p)();
第一个表示该函数返回值是一个指向浮点数的指针
第二个则说明p是一个函数指针,它所指向的函数返回值为浮点数类型。
知道一个类型声明方式之后,则该类型的类型转换符也就很容易可以得到:将声明中的变量名和末尾的分好去掉,然后将剩余部分用一个括号括起来即可,如:
float(*p)(); p为一个指向返回值为浮点数的函数的指针;
因此(float(*)()) 表示一个指向返回值为浮点数类型的函数的指针的类型转换符。
分析 (*(void(*)())0)();
第一步,假设变量fp为一个函数指针,如何调用fp所指向的函数?方法如下:(*fp)();
第二步,考虑用恰当的表达式替换fp,因运算符*必须要一个指针作为操作数,因此需要对0做类型转换,转换后的类型为:指向返回值为void类型的函数的指针。
指向返回值为void类型的函数的指针的声明为void (*fp)();,因此其类型转换符为(void (*)())。
将0进行类型转换的语句为(void (*)()) 0;
用(void (*)()) 0代替fp即可得到(*(void(*)())0)();
借助typedef声明:
typedef void (*fp)();
(*(fp)0)();