- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
对于这个简单的代码来说:
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/
我是一名优秀的程序员,十分优秀!