首页 > 学院 > 开发设计 > 正文

理解函数声明

2019-11-11 05:08:12
字体:
来源:转载
供稿:网友
本文内容来自对《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)();
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表