那么函数指针的*可以省略吗?

Qia*_*ian 4 c function-pointers shorthand

gcc似乎在告诉我int foo(int (*f)(void))int foo(int (f)(void)) f指向函数的指针是一样的,它不返回任何参数int.为什么我们可以省略*这里.

不过,我也尝试过int (*p)(void)int (p)(void).第一个p是函数指针,第二个是函数.

那么,发生了什么?在什么情况下可以省略星号?我在K&R中查找并没有发现任何东西.

Chr*_*ris 7

引用我的Harbison和Steele副本(第5版,第9.3节):

在参数列表中,隐式地重写类型"返回T的函数"以具有类型"指向函数返回T的指针".

这意味着在形式参数列表的上下文中,它们是等价的.在任何其他情况下,它们都是不同的.

作为一种风格问题,我永远不会忽略*.

  • @TheoYou:是的,由于关于函数类型表达式的隐式转换的单独规则.即使在常规函数调用`func(arg)`中,表达式`func`也会隐式转换为指针,这就是`()`函数调用"运算符"所需要的.在参数声明和表达式中,数组也会发生类似的事情. (2认同)