c - 对于函数指针 func_ptr,(*func_ptr)() 调用该函数。但是为什么 (****func_ptr)() 或 (***func_ptr)() 有效?

标签 c function function-pointers

假设func_ptr是一个指向函数test()的函数指针。那么我们知道可以使用这个函数调用函数test()指针为

   (*func_ptr)();

但今天有人告诉我,即使 (***func_ptr)()(************func_ptr)() ,即任何数量的*作品。为什么会这样?原因是什么。我在评论中被简单告知了原因,但我就是无法理解它。这就是我被告知的:

Well, when you dereference a function pointer, you get an expression of function type (technically a "function designator"). However, when used in most contexts, such a function expression will be implicitly converted back to a function pointer that points to itself. (This is similar to how in most contexts, an expression of array type will be implicitly converted to a pointer to its first element.) You can repeat this "loop" as many times as you want.

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

最佳答案

您需要考虑取消引用函数指针可能意味着什么。从技术上讲,它可以被赋予意义,函数指针指向代码,因此取消引用它会在指向的地址处给出机器代码指令。但这能给你带来什么?你要按照指示做什么?就此而言,在指令长度可变的机器(例如 x86 等 CISC 处理器)上应该发生什么?

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

因此,正如您所观察到的,任何数量的 * 都没有效果。明智的选择是不使用任何内容。

关于c - 对于函数指针 func_ptr,(*func_ptr)() 调用该函数。但是为什么 (****func_ptr)() 或 (***func_ptr)() 有效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16383736/

相关文章:

c - 如何在 LLVM 中获取函数指针

C++ 应该重载函数还是 if 语句就足够了?

c - Doxygen 无法解析 C 函数指针签名

c++ - 等价于 C++ 中的 C NULL 函数指针?

javascript - 分配 jQuery 函数被认为有害吗?

c - 指针减法给出奇怪的结果

c - 如何在 opengl 着色器中使用 unsigned short?

c - 禁用默认警告的警告/错误

javascript - 使用自定义函数的传递参数创建对象

python - 如何将函数名称列表作为参数传递?