C语言中变量的复杂声明和定义

我们知道:任何C语言变量的声明都由两部分组成:类型以及一组类似表达式的声明符。一旦我们知道如何声明一个给定类型的变量,那么该类型的类型转换符就很容易得到:只需要把声明中的变量名和末尾的分号去掉,再将剩余的部分用一个括号整个“封装”起来即可。例如:float (*h)();表示h是一个指向返回值为浮点类型的函数的指针,所以(float (*)())一个“指向返回值为浮点类型的函数的指针”的类型转换符。

拥有了这些知识,下面我们将分析一个更为复杂的表达式:(*(void(*)())0)();对此,我们分两步分析此表达式。

第一步:假定fp是一个函数指针,调用fp所指向的函数方法是:(*fp)();因为fp是函数指针,则*fp是该指针所指向的函数,所以(*fp)()就是调用该函数的方式。在表达式(*fp)()中,*fp两侧的括号非常重要,因为函数运算符()的优先级高于单目运算符*。如果*fp两侧没有括号,那么*fp()实际上与*(fp())的含义完全一样,ANSI C把它作为*((*fp)())的简写形式。剩下的问题就是找到一个恰当的表达式替换fp.

第二步:解决问题。我们知道如何声明一个变量,也就知道如何对一个常数进行类型转换,将其转型为该变量的类型:只需在变量声明中去掉变量名。因此,将常数0转型为“指向返回值为void的函数的指针”类型,可以写为(void(*)())0,因此可以用(void(*)())0来替换fp,从而得到(*(void(*)())0)();



下面再举几个例子,以便更深一步的了解。

1.void *(*(*fp1) (int)) [10]; fp1是一个指向函数的指针,该函数接受一个整形参数并返回一个指向含有10个void指针数组的指针。

2. float (*(*fp2)(int,int,float))(int); fp2是一个指向函数的指针,该函数接收三个参数(int,int,float)且返回一个指向函数的指针,该函数接受一个整型参数并返回一个float.

3.int (*(*fp4()) [10]) ();  这不是变量而是一个函数,fp4是一个返回指针的函数,该指针指向含有10个函数指针的数组,这些函数返回整型值。



以上分享参考:C陷阱与缺陷 和C++编程思想第一卷

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值