gpt4 book ai didi

c - 为什么 `p()` 和 `(*p)()` 都有效?

转载 作者:太空狗 更新时间:2023-10-29 15:54:09 27 4
gpt4 key购买 nike

对于这个简单的代码来说:

int foo(void);
int (*p)(void);
p = foo;
p = &foo;
int a = p();
int b = (*p)();

在上面的例子中,第3&4行都有效,第5&6行也都有效。

事实上,如果您尝试像使用函数指针那样使用变量指针,您的程序肯定会死掉。那么为什么它对函数指针有效呢?

最佳答案

函数(更准确地说,函数指示符)被转换为指向函数的指针(除非它是sizeof 的操作数,_Alignof,或一元 &)。所以 foo&foo 是同一件事,因为 foo 会自动转换为 &foo

同理,p是一个函数指针,所以*p是函数,所以会自动转换为函数的地址。

事实上,因为 *p 立即转换回指针,您可以再次将 * 应用于它,如 int b = (* *p)();。你可以一次又一次地这样做:int b = (************p)();

来自 2011 C 标准(委员会草案 N1570),6.3.2.1 4:

A function designator is an expression that has function type. Except when it is the operand of the sizeof operator, the _Alignof operator, or the unary & operator, a function designator with type “function returning type” is converted to an expression that has type “pointer to function returning type”.

这只是因为 C 开发人员希望能够轻松使用像 foo 这样的函数和像 p 这样的指向函数的指针。如果您必须为其中一个编写 foo() 而为另一个编写 (*p)(),那会有点麻烦。或者至少打字更多。或者,如果您必须为其中一个编写 (&foo)() 而为另一个编写 p(),这又是一次更多的输入。所以他们只是说只要你写一个函数,我们就会自动把它变成指针,你不用再输入就可以调用它。

我想他们本可以说函数调用运算符可以接受函数或指向函数的指针,但他们选择了自动转换。

推论:如果您不知道某物是函数、函数指针还是指向函数指针的指针,等等,只需在前面打一百个星号它,编译器将在到达该函数时停止。

关于c - 为什么 `p()` 和 `(*p)()` 都有效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47320240/

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