考虑到这点代码3型动物函数调用的语义:函数调用与不同的语义
void f(void){
puts("OK");
}
int main(void){
f();
(*f)();
(&f)();
return 0;
}
首先是调用F的标准方式,
第二是语义解引用函数指针,
但在第三我运用&运算符的函数名称,它似乎工作正常。
第二和第三种情况会发生什么?
谢谢。
考虑到这点代码3型动物函数调用的语义:函数调用与不同的语义
void f(void){
puts("OK");
}
int main(void){
f();
(*f)();
(&f)();
return 0;
}
首先是调用F的标准方式,
第二是语义解引用函数指针,
但在第三我运用&运算符的函数名称,它似乎工作正常。
第二和第三种情况会发生什么?
谢谢。
函数调用是总是通过函数指针执行。从C99第6.5.2.2节开始:
表示被调用函数的表达式应该有指向函数的类型指针。
但是,在几乎所有情况下,函数类型都衰减为函数指针类型。从C99节6.3.2.1:
除了当它是
sizeof
操作者的操作数 或一元&
操作者,功能指示器与 型“函数返回类型”被转换到具有表达类型“指向 函数返回类型”。
所以,你的三个电话因此被评价:
(&f)();
(&(*(&f)))();
(&f)();
全部都是有效的。但显然,第一个(f()
)是最干净和最容易阅读的。
在第二种情况下,您正在使用函数指针。函数指针用于记忆对函数的引用,并且可以在您的调用的其他地方调用它。它们通常用于实现回调。 所以,如果你有一个指向函数的指针,你应该使用第一个符号。
我想第一个和第三个是等价的。 在如果声明一个函数指针其实你可以初始化以下两个方面:
void AFunction();
void (*funcPtr)() = NULL;
funcPtr = AFunction;
funcPtr = &AFunction;
的函数指针被解除引用在第三个呼叫。 –
为了好玩尝试'(********** f)();' – Flexo
我在问什么情况下有人应该使用第二个和第三个电话...... –