函数类型与函数指针类型

时间:2014-04-22 12:12:53

标签: c++

我正在尝试理解以下两段代码之间的区别:

void f(int (*func)(int))
{
    func(5);
}

void g(int (func)(int))
{
    func(5);
}

给定以下代码,两个函数的工作方式相同:

int blah(int a)
{
    cout << "hello" << endl;
    return 0;
}

int main()
{
    f(blah);
    g(blah);

    return 0;
}

但是,如果我写下面的代码:

int (*foo)(int);
int (goo)(int);
foo = blah;
goo = blah;

我收到 goo = blah 的编译错误。但在第一个例子中,我可以调用函数调用 g(blah),它看起来与 goo = blah 非常相似。为什么一个工作而另一个工作?

2 个答案:

答案 0 :(得分:9)

有点令人困惑的是,你可以声明一个函数将函数作为参数(即使这没有意义),效果是使参数成为函数指针。这类似于声明一个看起来像数组的函数参数的方式,但实际上是一个指针。

函数参数可以是函数的名称,有或没有&来显式获取其地址。如果省略&,则会有隐式的函数到指针转换。同样,这类似于向数组传递(指针),其中隐式数组到指针转换意味着您只需要编写数组的名称,而不是&array[0]

在声明变量时,该规则不适用; int goo(int);(在goo周围有或没有不必要的括号)声明一个函数,而不是一个指针,你不能分配给函数。

答案 1 :(得分:1)

它类似于数组和指针之间的差异,例如如果你有:

char *foo;
char bar[N];

你可以这样做:

foo = bar;

但你不能这样做:

bar = foo;

当在参数声明中使用函数类型时,它被转换为等效的函数指针,就像声明:

void fun(int arr[]);

被翻译为:

void fun(int *arr);