指向函数参数与函数参数的指针?

时间:2014-05-24 01:27:45

标签: c++ pointers

我想了解以下两个声明f1f2之间的区别: 在f1中,我声明参数是指向void()类型函数的指针,f2声明与f1的不同之处是什么?声明是否相同?在main中,我可以使用原型void ()的函数调用它们。我理解传递值/指针/引用的概念,但这些是函数,并没有真正理解它们的区别。这不像我可以“修改”f1中作为参数传递的函数...谢谢!

PS:在遇到众所周知的最令人烦恼的解析问题时遇到了这个问题:)

#include <iostream>

using namespace std;

void f1(void (*x)())
{
    x();
}

void f2(void x())
{
    x();
}

void g1()
{
    cout << "Invoking f1(g1())" << endl;
}

void g2()
{
    cout << "Invoking f2(g2())" << endl;
}


int main() 
{
    f1(g1);
    f2(g2);
}

程序编译,输出

Invoking f1(g1())
Invoking f2(g2())

3 个答案:

答案 0 :(得分:13)

在C和C ++中,如果声明函数参数具有函数类型,则其类型将调整为函数指针。

C99,§6.7.5.3/ 8

  

参数声明为''函数返回类型''应调整为''指针指向              函数返回类型'',如6.3.2.1。

C ++ 11,§8.3.5/ 5

  

......之后   确定每个参数的类型,“T的数组”或“返回T的函数”类型的任何参数是   调整为“指向T的指针”或“指向函数返回T的指针”,分别为......

因此,在C ++中,我们可以将f1f2的类型都写为void(void(*)())

答案 1 :(得分:7)

他们是等同的。您对参数中发生的隐式指针转换感到困惑。

由于您无法将函数作为参数传递给函数(除了调用它们或取其地址之外,您无法对C中的函数执行任何操作),编译器会自动将参数更改为指向函数的指针

这与数组发生的情况大致相同 - 您也无法将数组作为函数参数传递,因此每当您将函数参数声明为数组时,它都会以静默方式更改为指针。

答案 2 :(得分:2)

它们是完全相同的替代语法。在这两种情况下都会传递函数指针,但允许您在参数列表中使用非指针语法。函数名的使用总是衰减到指向函数的指针(这可以递归地发生)。