有这段代码:
void a() { }
int main(){
a();
(****&a)();
return 0;
}
声明(****&a)();
与a();
具有相同效果的情况如何?
答案 0 :(得分:7)
这完全是因为函数到指针的转换(§4.3):
函数类型
T
的左值可以转换为类型为“T
指针”的prvalue。结果是指向函数的指针。
&a
首先为您提供指向a
的指针。然后用*
取消引用它,为你提供函数本身。然后,您尝试取消引用该函数,但由于您不能,它会进行函数到指针转换以再次获取指针。您可以使用*
取消引用该指针,依此类推。
最后(****&a)
表示函数a
并且您调用它,因为您可以将()
应用于函数而不进行函数到指针转换。