一元&的结果运算符应用于函数

时间:2012-12-01 23:51:32

标签: c gcc function-pointers c99 unary-operator

C99 6.3.2.1/4

  

函数指示符是具有函数类型的表达式。除了   当它是sizeof运算符的操作数或一元&   运算符,类型为“函数返回类型”的函数指示符   转换为具有“指向函数的指针”类型的表达式   返回类型“。

据我了解,这表明除了sizeof运算符和一元&运算符应用于函数之外;没有函数指针转换会发生。但是从我所看到的,

int (*p)(int) = &foo;

,或者

int (*p)(int) = foo;

两者似乎都有效。这表明&foofoo都是等价的。那么,如果一元&运算符具有如上所示的效果,它会在哪里产生影响?

2 个答案:

答案 0 :(得分:3)

你以某种方式理解它倒退了。相反, function 类型会自动衰减到函数指针类型,除非在sizeof或{{1}下使用函数标识符}。

同样,在&sizeof下,函数类型不会衰减到指针。在所有其他情况下,它衰减到指针类型。 (反过来,这会导致将&应用于函数是非法的。)

C中函数类型的行为反映了数组类型的众所周知的行为:除非在sizeofsizeof下使用它们,否则它们会立即被隐式转换为指针类型。

这意味着在您的示例中,表达式&&foo是等效的。在第一种情况下,指针由显式应用foo生成。在第二种情况下,指针由隐式“函数类型衰减”特征产生。两种情况下指针值都相同。

答案 1 :(得分:1)

int (*p)(int) = foo;

自动转换为函数指针,因此它等同于

int (*p)(int) = &foo;

其中转换为函数指针不是自动的,而是由&运算符实现的。

通常转换为foo的隐式指针没有可以采用的地址。如果可以采用其地址,则不会是foo的地址。