C语言 对于函数指针func_ptr,(*func_ptr)()调用该函数.但是为什么(* * * * func_ptr)



假设func_ptr是指向函数test()的函数指针,那么我们知道可以使用该指针调用函数test()作为

   (*func_ptr)();

但我今天被告知,即使(***func_ptr)()(**********func_ptr)(),即与任何数量的*工作。为什么会这样呢?原因是什么?有人在评论中简要地告诉了我原因,但我就是不明白。这是我被告知的:

当你解引用一个函数指针时,你得到一个函数类型的表达式(技术上是一个"函数指示符")。然而,当在大多数上下文中使用时,这样的函数表达式将隐式地转换回指向自身的函数指针。(这类似于在大多数上下文中,数组类型的表达式将隐式转换为指向其第一个元素的指针。)你可以重复这个"循环",只要你想。

谁能用简单的话更详细地解释一下?

您需要考虑解引用函数指针可能意味着什么。从技术上讲,它可以被赋予一个意义,函数指针指向代码,因此解引用它在指向地址处给出机器代码指令。但这能给你带来什么呢?你打算怎么处理这条指令?就此而言,在指令长度可变的机器上,比如像x86这样的CISC处理器,应该会发生什么?

显然,这些问题没有明确的答案。因此,C语言设计者可以选择禁止解引用函数指针。或者他们可以指定对函数指针解引用没有效果,并产生完全相同的指针值。他们选择了后者。

所以任何数量的*都没有影响,正如你所观察到的。同样的选择是使用none

最新更新