C99 6.3.2.1/4
函数指示符是具有函数类型的表达式。除了 当它是sizeof运算符的操作数或一元& 运算符,类型为“函数返回类型”的函数指示符 转换为具有“指向函数的指针”类型的表达式 返回类型“。
据我了解,这表明除了sizeof
运算符和一元&
运算符应用于函数之外;没有函数指针转换会发生。但是从我所看到的,
int (*p)(int) = &foo;
,或者
int (*p)(int) = foo;
两者似乎都有效。这表明&foo
和foo
都是等价的。那么,如果一元&
运算符具有如上所示的效果,它会在哪里产生影响?
答案 0 :(得分:3)
你以某种方式理解它倒退了。相反, function 类型会自动衰减到函数指针类型,除非在sizeof
或{{1}下使用函数标识符}。
同样,在&
和sizeof
下,函数类型不会衰减到指针。在所有其他情况下,它衰减到指针类型。 (反过来,这会导致将&
应用于函数是非法的。)
C中函数类型的行为反映了数组类型的众所周知的行为:除非在sizeof
或sizeof
下使用它们,否则它们会立即被隐式转换为指针类型。
这意味着在您的示例中,表达式&
和&foo
是等效的。在第一种情况下,指针由显式应用foo
生成。在第二种情况下,指针由隐式“函数类型衰减”特征产生。两种情况下指针值都相同。
答案 1 :(得分:1)
在
int (*p)(int) = foo;
自动转换为函数指针,因此它等同于
int (*p)(int) = &foo;
其中转换为函数指针不是自动的,而是由&
运算符实现的。
通常转换为foo
的隐式指针没有可以采用的地址。如果可以采用其地址,则不会是foo
的地址。