Chinaunix首页 | 论坛 | 博客
  • 博客访问: 728204
  • 博文数量: 134
  • 博客积分: 3207
  • 博客等级: 中校
  • 技术积分: 1995
  • 用 户 组: 普通用户
  • 注册时间: 2009-04-01 20:47
文章分类

全部博文(134)

文章存档

2022年(1)

2020年(7)

2018年(2)

2016年(5)

2015年(14)

2014年(21)

2013年(3)

2012年(1)

2011年(15)

2010年(30)

2009年(35)

分类: C/C++

2010-07-21 10:58:02

在书中第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位置的子程序。

阅读(1066) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~