读《C缺陷与陷阱》之-函数声明理解
时间:2010-07-21 来源:lanlovehua
在书中第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位置的子程序。
(*(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位置的子程序。
相关阅读 更多 +