我对将函数指针分配给变量的正确语法有点困惑。如果我有一个函数 foo
int foo();
我将指向 foo 的指针分配给变量 bar
void * bar;
我是否使用似乎并不重要
bar = foo;
// or
bar = &foo;
在我看来,其中只有一个应该是正确的,还是我遗漏了什么?
我对将函数指针分配给变量的正确语法有点困惑。如果我有一个函数 foo
int foo();
我将指向 foo 的指针分配给变量 bar
void * bar;
我是否使用似乎并不重要
bar = foo;
// or
bar = &foo;
在我看来,其中只有一个应该是正确的,还是我遗漏了什么?
foo
和&foo
值在 C 中是等价的并且具有相同的类型。
这里的&
操作符是正确的,但是是多余的。
请注意,将函数指针分配给 avoid *
在 C 中是无效的。
void *fp1 = foo; // invalid
int (*fp2)() = foo; // valid
int (*fp3)() = &foo; // valid
(这些实际上是声明,但适用赋值运算符的约束。)
让我再解释一下。
foo 和 &foo 值在 C 中是等价的并且具有相同的类型。
正如@ouah 对答案的评论所指出的那样,这并不完全正确。特别:
sizeof(foo)
无效,并且sizeof(&foo)
是指针的大小。&foo
是指向 foo 的指针,while&(&foo)
是无效的。但是,在所有其他情况下,它们实际上是相同的,正如 C 的标准所提到的(参考例如C11 的草案):
6.3.2.1.4:函数指示符是具有函数类型的表达式。除非它是 sizeof 运算符或一元 & 运算符的操作数,否则类型为“函数返回类型”的函数指示符将转换为类型为“指向函数返回类型的指针”的表达式。
和sizeof
一元运算&
符是函数指示符未转换为指针时仅有的两个例外。
PS你也可以找到原因sizeof(foo)
和&(&foo)
无效:
6.5.3.2.1:一元运算
&
符的操作数应该是一个函数指示符、一个[]
或一元运算符的结果*
,或者一个左值,它指定一个不是位域且未使用寄存器存储声明的对象-类说明符。6.5.3.4.1
sizeof
运算符不得应用于具有函数类型或不完整类型的表达式、此类类型的括号名称或指定位域成员的表达式。