C陷阱与缺陷-1理解函数申明

在该章节中,作者用一个方法调用了地址为0的函数:(*(void(*)())0)();
接下来,我们一步步分析。
一、首先,我们了解,在C语言中:
1、类型转换是小括号把类型包括后放在目标表达式左边。
如:(char)A; (int *)B;
类型转换和申明变量类似,只是将申明的变量符号去除,并用小括号包括起来。
如将a申明一个int类型的变量,为:int a;
将b类型转换成char类型的变量,为 (char)b;
2、在C语言中,int *p;/int *p();/int (*p)();/三个语句各不相同。
int *p;中,* 优先级高,与p结合,表明这是一个指针,指向int类型。
int *p();中,()优先级高,先与p结合,表明这是一个函数;再与* 结合,表明这个函数返回一个指针,指向int类型。
int (*p)();中,由于有小括号,p先与* 结合,表明这是个指针,指向一个返回int类型的函数。所以这是一个函数的指针。
二、所以,如果需要调用地址为0的函数,需要如下步骤:
1、先将地址的指向转换成函数;
2、使用调用函数指针的方式调用。
三、因此由前面的知识我们知道,如何将变量转换成函数指针。
我们可以先申明一个函数指针,这个指针可以指向任何类型(即void)。所以,我们可以写下如此例子: void(*p)()。然后我们将申明的变量符号p去除,并用小括号包括起来,可得:(void(*)())。因此,我们可以用(void(*)())去将变量类型转换成函数指针。即:(void(*)())0,当我们调用一个函数指针的时候,我们是这样调用的:(*p)();。所以调用地址为0的函数,我们可以写作:

(*(void(*)())0)();
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值