分配函数指针的正确方法

时间:2013-03-07 20:08:51

标签: c function-pointers

我对将函数指针赋给a的正确语法感到困惑 变量。如果我有一个函数foo

int foo();

我将指向foo的指针分配给变量栏

void * bar;

如果我使用

似乎并不重要
bar = foo; 
// or 
bar = &foo; 

在我看来,其中只有一个应该是正确的还是我错过了什么?

2 个答案:

答案 0 :(得分:10)

foo&foo值在C中是等效的,并且具有相同的类型。

这里的&运算符是正确的但是多余的。

请注意,为void *指定函数指针在C中无效。

void *fp1 = foo;   // invalid
int (*fp2)() = foo;  // valid
int (*fp3)() = &foo; // valid

(这些实际上是声明,但赋值运算符的约束适用。)

答案 1 :(得分:2)

让我再解释一下。

  

foo和& foo值在C中是等价的,并且具有相同的类型。

这不完全正确,正如@ouah对答案的评论所指出的那样。特别:

  1. sizeof(foo)无效,sizeof(&foo)是指针的大小。
  2. &foo是指向foo的指针,而&(&foo)无效。
  3. 但是,它们在所有其他情况下实际上是相同的,正如C标准所提到的那样(参考例如draft of C11):

      

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

    当函数指示符未转换为指针时,sizeof和一元&运算符是唯一的两个例外。

    P.S。您还可以找到sizeof(foo)&(&foo)无效的原因:

      

    6.5.3.2.1:一元&运算符的操作数应该是函数指示符,[]或一元*运算符的结果,或者是指定的左值一个不是位字段的对象,并且没有使用寄存器存储类指定器声明。

         

    6.5.3.4.1 sizeof运算符不应该应用于具有函数类型或不完整类型的表达式,这种类型的带括号的名称,或者指定一个位字段成员的表达式。