使用函数指针进行静态结构初始化

时间:2015-06-04 11:30:51

标签: c static initialization structure

我已经用函数名初始化了一个静态结构,如下所示。

我们必须使用常量初始化静态结构。函数名是C中的常量吗?

struct fp {
        int (*fn)();
};
int f1()
{
        printf("f1 called \n");
        return 0;
}
static struct fp fps = {
        .fn = f1,
};
int main()
{
        fps.fn();
        return 0;
}

如果在初始化结构时进行编译没有任何问题,如下所示。

static struct fp fps = {
        .fn = &f1,
};

在C中,对于函数名,f1和& f1都相同?

1 个答案:

答案 0 :(得分:3)

f1是函数的名称。在大多数情况下,当用作表达式时,函数名称会自动衰减到指向函数的指针。衰变未发生的一个上下文是函数名称是地址运算符(&)的操作数。因此,作为评估表达式,f1&f1通常是相同的。

实际上,在任何函数调用表达式f(args)中,f是指向函数的指针。您可以简单地通过名称调用函数的原因是因为函数名称自动衰减到函数指针。

您也可以转换它并取消引用函数指针。它们会立即衰减回指针:

int f(void);

f();         // "f" decays to &f
(&f)();      // normal call via function pointer, no implicit decay
(*f)();      // why not
(*****f)();  // ditto