关于《C陷阱和缺陷》中的(*(void(*)())0)()表达式的一点解析
来源:互联网 发布:mac mini a1176配置 编辑:程序博客网 时间:2024/05/01 14:47
如《C陷阱和缺陷》书中所说,表达式(*(void(*)())0)()功能主要用于模拟在计算机启动时,作为硬件调用首地址为0的子程序的C语句。
对于第一次看到这个表达式的人,都会有无从下手的感觉。但通过对书中所阐述的解释,终于一点一点理解了这个表达式。
解析如下:
1.指向函数指针的定义为:(type) (*Funcp)(),即Funcp为指向函数的指针,则(*Funcp)()为调用其指向函数的方式;
2.程序需要模拟硬件地址0,因此这里将Funcp替换为0,则为(*0)()形式。这里假如0为指向函数的指针;
3.*是指针表达形式,而0只是一个常量,不是指针,因此形如(*0)并不能生效。在这里,0如果能被转化为指针,那么(*0)就相当于调用实际的地址。
4.关于强制转换:1) void (*f) ()表示f指向一个返回值为void的函数指针;2) 那么,(void (*) ())就为一个“指向一个返回值为void的函数指针”的类型转换符。
5.将常量0通过(void (*) ())类型转换符强制转换为指针,这样就可以完全使用(void (*) ())0来替换Funcp,最终表达式为
(*(void(*)())0)();
另外,typedef的使用可以是(*(void(*)())0)()更为简洁,如下:
typedef void (*funcptr)();
(*(funcptr)0) ();
0 0
- 关于《C陷阱和缺陷》中的(*(void(*)())0)()表达式的一点解析
- C陷阱与缺陷:经典的 (* (void (*)( )) 0) ( ) 表达式
- c陷阱和缺陷的一点笔记
- 《C陷阱与缺陷》理解函数声明:(*(void(*)())0)() 和signal函数声明
- 《C陷阱与缺陷》理解函数声明:(*(void(*)())0)() 和signal函数声明
- 《C陷阱与缺陷》:如何理解(*(void(*)())0)()?
- "C陷阱和缺陷"中的几个知识点
- "C陷阱和缺陷"中的几个知识点
- C陷阱和缺陷
- C缺陷和陷阱
- c 缺陷和陷阱
- 看C陷阱与缺陷的一点收获
- 《c缺陷与陷阱》里的一点小错误
- 【C陷阱和缺陷】语义缺陷
- C语言陷阱和缺陷
- C语言陷阱和缺陷
- C语言:陷阱和缺陷
- C语言:陷阱和缺陷
- F
- 深度优先 树上最长单色路径
- 不拉伸button中的图片 button响应区域变大
- 八皇后问题深度优先遍历回溯算法的应用
- 无论怎样 其实都好
- 关于《C陷阱和缺陷》中的(*(void(*)())0)()表达式的一点解析
- Java之——操作SQLite
- ubuntu/windows atom apm命令问题
- Java多线程方面的问题
- Zookeeper源码分析之持久化(二)
- Java中包名、类名、方法名、成员变量名、属性名 大小写问题
- c++中vector的用法详解
- Linux上安装Weblogic 12c并部署iServer810 war包
- 数据库选择题和填空题面试题