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

来源:互联网 发布:mac mini a1176配置 编辑:程序博客网 时间:2024/05/01 14:47

如《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) ();


0 0
原创粉丝点击