关于《C陷阱和缺陷》中的(*(void(*)())0)()表达式的解析

如《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)()更为简洁,如下:

扫描二维码关注公众号,回复: 3864323 查看本文章

typedef void (*funcptr)();

(*(funcptr)0) ();

猜你喜欢

转载自blog.csdn.net/xiaobaixiongxiong/article/details/82963803
今日推荐