使用函数指针的静态结构初始化
static structure initialization with function pointers
我已经用函数名初始化了一个静态结构,如下所示。
我们必须用常量初始化一个静态结构。函数名在 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 中是常量吗?
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