理解函数声明
来源:互联网 发布:美国人用淘宝吗 编辑:程序博客网 时间:2024/04/29 01:39
本文内容来自对《C陷阱与缺陷》第2.1节的理解,并沿用了此章节的题目。
对于程序员来说,理解下面这样的声明是件让人头疼的事:
(*(void(*)())0)();
想要理解上述声明的含义需明白一条原则:按照使用的方式来声明。
首先要理解C变量声明的含义,例如float f,g;
上面的声明由类型float 和声明符f和g组成,意思为对f和g求值时将返回一个float类型的结果。
同理,声明 float ff()的意义为对ff()求值将得到一个float类型的结果,即ff为一个返回值为float类型数据的函数。
同理,声明 float *pf的意义为对*pf求值将得到一个float类型的结果,即fp为只想float类型的数据的指针。
同理,声明 float *g()的意义为对*g()求值将得到一个float类型的结果,即g()将返回一个float类型的指针,即g为一个返回值为float类型指针的函数。
同理,声明 float (*h)()的意义为对(*h)()求值将得到一个float类型的结果,即h是一个函数指针,所指向的函数的返回值类型为float。
其次,要知道如何定义轻质类型转换符:把声明中的变量名和生命末尾的分号去掉,同时将剩余的部分用一个大括号括起来就行了(高,实在是高啊)。
例如,float (*h)()为指向返回值为float类型的函数的指针,而(float (*)())就是指向返回值为float类型的函数的指针的强制类型转换符了。
现在来分析下(*(void(*)())0)()的含义。(void(*)())当然是void(*h)()的强制类型转换符,那么,(void(*)())就是将0转换为一个函数指针,这个函数指针存储的地址为0,那么(*(void(*)())0)()就是调用地址为0处的函数。哈哈,一切是那么自然而然。
当然,若用typedef来定义函数指针类型将带来更加直观的感受。
typedef void (*funcptr)();
(*(funcptr)0)();
0 0
- >--“ 理解函数声明 ”
- 理解函数声明
- 两个函数声明的理解
- 两个函数声明的理解
- 两个函数声明的理解
- 深入理解C函数声明
- 如何理解signal函数声明
- signal函数声明的理解
- Js函数深入理解-函数声明
- 深入理解变量声明提升和函数声明提升
- 深入理解变量声明提升和函数声明提升
- 深入理解变量声明提升和函数声明提升
- 深入理解变量声明提升和函数声明提升
- 输入理解C语言中的函数声明
- 如何理解JaveScript中的函数声明提升
- js中函数声明提升理解
- typedef的理解及复杂函数声明的理解
- 简单理解函数声明(以signal函数为例)
- 虚拟机安装(初稿)
- TeamView11试用版到期转长期免费版
- python~ from string import Template
- Spring部分配置总结
- jquery实现定位导航效果
- 理解函数声明
- linux下安装ssh
- Activiti 23张数据库表
- linux安装ssh
- 博为峰Java技术文章 ——JavaSE Swing JTabbedPane选项卡面板II
- VS2010下建立MFC程序
- 使用camera、matrix仿即刻APP换一换
- 假期训练—— Repeating Decimals UVA - 202 模拟
- sed 脚本分隔符引起的问题 的问题