题目:如何调用存储首地址为0 的子程序。
答案:(*void(*)()0)();
好了下面我们来解析:
首先:我们要理解函数的声明
float f; //表示对其求值时,f类型为浮点型
float f(); //表达式f ()的结果是一个浮点数,即f 是一个返回浮点类型的函数。
float *pf;//*pf是一个浮点数,pf是指向浮点数的指针
float *g() , (*h)();
首先 表达式*g() , (*h)() 是浮点表达式,因为()的优先级高于* ,
故*g() 就是*(g()): g是一个函数,该函数的返回值类型为指向浮点数的指针(指针函数,注意中心词是函数,这个函数返回一个指针)。
同理:对于 (*h)() 来说,(*h)表示h 是一个浮点型的指针,该指针指向一个返回值为浮点型数据的函数。(函数指针,注意中心词是指针,这个指针指向一个函数地址)
由于,float (*pf) (); 表示 pf 是一个指向返回值为浮点型的函数的指针,所以调用该函数,就是 (*pf) ();
那么“调用存储首地址为0 的子程序。”是不是这样写呢,(*0)();
但是上式并不能生效,因为,* 运算符必须要一个指针来做操作数,
并且这个指针还要是个函数指针,这样经过运算付*作用后的结果,才能做为函数被调用。
所以必须对上式中0进行类型转换说明,把0转换为"指向返回值为void类型的函数的指针"
我们声明 void (*pf) (); 表示pf 是一个指向返回值为void 的函数指针
则表示“pf 是一个指向返回值为void 的函数指针” 的类型转换付为:(void (*) ())
//在声明表达式中,去掉指针名和函数参数,给外边加一个括号即可。
则 ,把0转换为"指向返回值为void类型的函数的指针" ,就是 :(void (*) ())0
好了现在我们把0地址转换为,指向返回值为void类型的函数的指针。
调用0地址的函数为:( *(void (*) ())0 ) ();
C traps and pitfalls 读书笔记之语法篇
最新推荐文章于 2022-02-25 19:38:17 发布