2012-06-24 22 views
5

考虑到这点代码3型动物函数调用的语义:函数调用与不同的语义

void f(void){ 
    puts("OK"); 
} 

int main(void){ 
    f(); 
    (*f)(); 
    (&f)(); 

    return 0; 
} 

首先是调用F的标准方式,

第二是语义解引用函数指针,

但在第三我运用&运算符的函数名称,它似乎工作正常。

第二和第三种情况会发生什么?

谢谢。

+1

的函数指针被解除引用在第三个呼叫。 –

+5

为了好玩尝试'(********** f)();' – Flexo

+0

我在问什么情况下有人应该使用第二个和第三个电话...... –

回答

8

函数调用是总是通过函数指针执行。从C99第6.5.2.2节开始:

表示被调用函数的表达式应该有指向函数的类型指针。

但是,在几乎所有情况下,函数类型都衰减为函数指针类型。从C99节6.3.2.1:

除了当它是sizeof操作者的操作数 或一元&操作者,功能指示器与 型“函数返回类型”被转换到具有表达类型“指向 函数返回类型”。

所以,你的三个电话因此被评价:

(&f)(); 
(&(*(&f)))(); 
(&f)(); 

全部都是有效的。但显然,第一个(f())是最干净和最容易阅读的。

+0

why(&( &f)())有效。当&f衰减到函数指针类型? – Raulp

+0

@softy:'&f'已经**了**函数指针类型。所以'&& f'是一个函数指针指针类型。 –

+6

@OliCharlesworth - 只有'&f'是一个r值,所以它不能是另一个'&'一元运算符的参数。 – rodrigo

1

在第二种情况下,您正在使用函数指针。函数指针用于记忆对函数的引用,并且可以在您的调用的其他地方调用它。它们通常用于实现回调。 所以,如果你有一个指向函数的指针,你应该使用第一个符号。

我想第一个和第三个是等价的。 在如果声明一个函数指针其实你可以初始化以下两个方面:

void AFunction(); 
void (*funcPtr)() = NULL; 

funcPtr = AFunction; 
funcPtr = &AFunction; 
相关问题