如《C陷阱和缺陷》书中所说,表达式(*(void(*)())0)()功能主要用于模拟在计算机启动时,作为硬件调用首地址为0的子程序的C语句。
对于第一次看到这个表达式的人,都会有无从下手的感觉。但通过对书中所阐述的解释,终于一点一点理解了这个表达式。
解析如下:
1.指向函数指针的定义为:(type) (*Funcp)(),即Funcp为指向函数的指针,则(*Funcp)()为调用其指向函数的方式;
2.程序需要模拟硬件地址0,因此这里将Funcp替换为0,则为(*0)()形式。这里假如0为指向函数的指针;
3.*是指针表达形式,而0只是一个常量,不是指针,因此形如(*0)并不能生效。在这里,0如果能被转化为指针,那么(*0)就相当于调用实际的地址。
4.关于强制转换:1) void (*f) ()表示f指向一个返回值为void的函数指针;2) 那么,(void (*) ())就为一个“指向一个返回值为void的函数指针”的类型转换符。
5.将常量0通过(void (*) ())类型转换符强制转换为指针,这样就可以完全使用(void (*) ())0来替换Funcp,最终表达式为
(*(void(*)())0)();
另外,typedef的使用可以是(*(void(*)())0)()更为简洁,如下:
typedef void (*funcptr)();
(*(funcptr)0) ();