- 神奇的函数声明
float *g(), (*h)();
这里先拆开来看
float * g();
这样就很容易看出来,这是函数的声明,函数名g
,返回值是float*
;
第二个是float (*h) ();
这样子看,也很容易看出来这是一个函数指针,(*h)
是函数名,返回值是float
;
-
(*(void(*)())0) ()
据说这是当计算机启动时,硬件将调用首地址为0位置的程序,然后为了显示模拟这一行为,写了上面这一神奇的语句。。。
按照上面的思路分析一下这个表达式:
首先根据上面我们先写出一个返回值为void类型的函数指针
void (*fp) ()
,那么调用它的写法为:
(*fp)(); 或者fp();
但是后者只是前者的简易写法,是编译器给我们提供了这种便利。前者才是正儿八经的标准写法。
然后我们想象如何写一个语句,将变量
f
转化为“指向返回值为void的函数的指针”,很容易我们可以得到下面的式子:
(void (*)()) f
,
然后f
可以是0
,所以我们得到这样的式子:
(void (*)()) 0
现在看是不是很接近了,和一开始的神奇的表达式对比;
这个表达式的意思其实是将0
转化为返回值为void的函数指针,然后我们使用调用函数指针的标准语法调用这个函数,即可。
接下来我们用这个式子代替指针函数调用(*fp)();
中的fp
,可以得到:
(*(void(*)())0) ()
;