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

如《C陷阱和缺陷》书中所说,表达式(*(void(*)())0)()功能主要用于模拟在计算机启动时,作为硬件调用首地址为0的子程序的C语句。

{  (*   {  (void(*)())  }   0)  }  ()

对于第一次看到这个表达式的人,都会有无从下手的感觉。但通过对书中所阐述的解释,终于一点一点理解了这个表达式。

解析如下:

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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值