gpt4 book ai didi

C语言函数指针怪异语法

转载 作者:行者123 更新时间:2023-11-30 16:49:31 24 4
gpt4 key购买 nike

这是一本旧教科书中的片段:C Traps and Pitfalls ,第二章。

(*(void(*)())0)();

这相当于更现代的:

typedef void (*function_pointer) ();
(*(function_pointer)0)();

我需要一些帮助来更好地理解 typedef 下面的第二行代码是什么。我该如何解释这种奇怪的语法?

最佳答案

与对象指针(包括数组指针)不同,使用函数指针时,&* 运算符是可选的。无论如何,有些人喜欢使用它们,认为它使代码对函数指针的使用更加清晰。我个人不同意,只是使用名称。

因此:

// given
typedef int (* F) (void);
extern int foo (void);

// the following definitions are all identical:
F fp1 = foo;
F fp2 = &foo;
F fp3 = *foo;

// as are the following call expressions:
foo ();
(&foo) ();
(*foo) ();
fp1 ();
(*fp1) ();
(******* fp1) ();

与数组的情况非常相似,在任何表达式中用作值的函数总是衰减为函数指针,除非用作立即参数>&。从技术上讲,这还包括函数调用表达式,因此括号左侧的内容始终是函数指针,即使调用直接到静态命名的函数(即表达式 foo ()) 。类似地,使用 * 取消引用函数指针会检索函数的“值”,但函数“值”唯一能做的就是立即衰减回指针,这就是为什么您可以使用 as 取消引用它许多星星,随你喜欢。

这些在运行时都没有任何影响;它只影响表达式的类型

使用函数指针作为 & 的直接参数会执行其他操作,但是:它将创建一个标准双指针(指向变量的指针) , or 如果函数表达式不是左值,则在语法上无效。您也可以在其中一些可选星号前面粘贴一层 & ,在这种情况下,它可以防止 * 运算符的结果立即衰减,而是将显式输入,但仍然一无所获。

因此,根据问题编写代码的更简单(并且在我看来更清晰)的方法如下:

typedef void (*function_pointer) ();

// 1 - direct
((function_pointer)0)();

// 2 - intermediate variable
function_pointer fp = (function_pointer)0;
fp ();

大多数星星什么都不做,没有它们代码更容易阅读。这也表明问题表达式的第二行实际上是两个操作(两者通常在机器级别都是无操作) - 首先它将0转换为类型function_pointer,然后然后它应用*。 (然后在第三个无操作中,它再次将括号外的 * 衰减掉。)

关于C语言函数指针怪异语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42563195/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com