在该章节中,作者用一个方法调用了地址为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)();