假设func_ptr
是指向函数test()
的函数指针,那么我们知道可以使用该指针调用函数test()
作为
(*func_ptr)();
但我今天被告知,即使(***func_ptr)()
或(**********func_ptr)()
,即与任何数量的*工作。为什么会这样呢?原因是什么?有人在评论中简要地告诉了我原因,但我就是不明白。这是我被告知的:
当你解引用一个函数指针时,你得到一个函数类型的表达式(技术上是一个"函数指示符")。然而,当在大多数上下文中使用时,这样的函数表达式将隐式地转换回指向自身的函数指针。(这类似于在大多数上下文中,数组类型的表达式将隐式转换为指向其第一个元素的指针。)你可以重复这个"循环",只要你想。
谁能用简单的话更详细地解释一下?
您需要考虑解引用函数指针可能意味着什么。从技术上讲,它可以被赋予一个意义,函数指针指向代码,因此解引用它在指向地址处给出机器代码指令。但这能给你带来什么呢?你打算怎么处理这条指令?就此而言,在指令长度可变的机器上,比如像x86这样的CISC处理器,应该会发生什么?
显然,这些问题没有明确的答案。因此,C语言设计者可以选择禁止解引用函数指针。或者他们可以指定对函数指针解引用没有效果,并产生完全相同的指针值。他们选择了后者。
所以任何数量的*都没有影响,正如你所观察到的。同样的选择是使用none