我已经用函数名初始化了一个静态结构,如下所示。
我们必须用常量初始化静态结构。函数名在 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 是否相同?
最佳答案
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
关于c - 使用函数指针的静态结构初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30642715/