【C语法陷阱】:怎样理解(*(void(*)())0)()


首先我们回忆一下C语言中变量是怎样声明的?任何C语言的变量声明都由两部分组成:类型、变量名(声明符)。
例如:int a,b;

接下来我们试着声明一个函数:
float  g( );  这个声明的含义是g是一个返回值为浮点类型的函数。

然后,我们在声明一个指针:
float *pf;  这个声明的含义是pf是一个指向浮点数的指针


★现在,我们分两步分析表达式(*(void(*)())0)().

①假设变量fp是一个函数指针,用(*fp)( );调用函数,因为fp是一个函数指针,*fp就是指针所指向的函数,所以(*fp)( );就可以调用该函数。
②函 数运算符()的优先级高于单目运算符*。假设fp是指向一个无返回值类型的指针,调用它的方式为void (*fp)( ),此时fp变量的类型是void(*)( ),然后将常数0强制类型转换为(void(*fp)( ))0。因此,我们可以用void(*fp)( ))0代替fp,调用函数就是(void(*fp)( ))0)();
注:变量的类型就是把变量名去掉剩下的东西

 ●我们可以用typedef换一下上述表达式的类型名
 例如:typedef  void (*ff)( );因此, 调用函数的方式可以写成:(*(ff)0) ( );
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值