为什么表达式 a() 和 (****&a)() 调用同一个函数?

Why expressions a() and (****&a)() call the same function?

本文关键字:同一个 函数 调用 表达式 为什么      更新时间:2023-10-16

有这样的代码:

void a() { }
int main(){
   a();
   (****&a)();
   return 0;
}

为什么语句(****&a)();a();具有相同的效果?

这都是因为函数到指针的转换(第4.3节):

函数类型为T的左值可以转换为"指向T的指针"类型的右值,得到指向该函数的指针。

&a首先给你一个指向a的指针。然后用*解引用它,得到函数本身。然后尝试对该函数解引用,但由于不能解引用,因此它将进行函数到指针的转换以再次获得指针。您可以使用*来解引用该指针,等等。

最后,(****&a)表示函数a,您可以调用它,因为您可以将()应用于函数,而无需进行函数到指针的转换。

相关文章: