读《C缺陷与陷阱》之-函数声明理解

在书中第2章第一节中,作者首先提到的这样一个函数让我很是困惑:
(*(void(*)())0)();
这个函数的功能是这样的:当计算机启动时,硬件将调用首地址为0位置的子程序。
为什么会有这样的功能呢?这里要从声明函数说起,例如:
float ff();
这个很好理解:ff是一个返回值为浮点型的函数。再看:
float *g(), (*h)();
由于()结合的优先级高于*,*g()也就是*(g())。g是一个函数,该函数返回值是一个指向浮点数的指针。同理,可以得出h是一个函数指针,h所指向的函数的返回值是浮点类型的。
一旦我们知道了如何声明一个给定类型的变量,那么该类型的类型转换符就很容易得到了  : 只要把声明中的变量名和声明末尾的分号去掉,再将剩余的部分用一个括号整个“封装”起来即可。例如如下声明:
float (*h)();
表明h是一个指向返回值为浮点类型的函数的指针。因此
(float (*)())
表示一个“指向返回值为浮点类型的函数的指针”的类型转换符。
理解了以上的知识,我们就可以分析出
下面这个函数:
(*(void(*)())0)();

首先看一下这个:(void(*)()).这个就是前面所提到的类型转换符。
它是怎样的类型转换符呢?
很明显,这是一个“指向返回这为void类型的函数的指针”的类型转换符。
(*(void(*)())0)()是将0转换为一个函数指针。最外面的*是取这个函数指针的内容,即调用首地址为0位置的子程序。

<script type=text/javascript charset=utf-8 src="http://static.bshare.cn/b/buttonLite.js#style=-1&uuid=&pophcol=3&lang=zh"></script> <script type=text/javascript charset=utf-8 src="http://static.bshare.cn/b/bshareC0.js"></script>
阅读(303) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~
评论热议
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值