0

C99 6.3.2.1/4

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

据我了解,这表明除非将sizeof运算符和一元运算&符应用于函数;不会发生函数到指针的转换。但据我所见,

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

或者,

int (*p)(int) = foo;

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

4

2 回答 2

3

你以某种方式理解了它。相反,除非在or下使用函数标识符,否则函数类型会自动衰减为函数指针类型。sizeof&

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

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

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

于 2012-12-01T23:56:57.847 回答
1

int (*p)(int) = foo;

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

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

其中转换为函数指针不是自动的,而是由&操作员完成的。

通常转换到的隐式指针foo没有可以获取的地址。如果它的地址可以被取走,它就不会是 的地址foo

于 2012-12-01T23:53:59.857 回答