C陷阱与缺陷--读书笔记

  1. 神奇的函数声明
  • 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) ()

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容