函数类型与函数指针类型

function type vs. function pointer type

本文关键字:函数 类型 指针      更新时间:2023-10-16

我试图理解以下两个代码块之间的区别:

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的编译错误。但在第一个例子中,我可以调用make函数调用g(blah),这似乎与goo=blah非常相似。为什么一个有效而另一个无效?

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

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

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

它类似于数组和指针之间的区别,例如,如果您有:

char *foo;
char bar[N];

你可以做:

foo = bar;

但你不能做:

bar = foo;

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

void fun(int arr[]);

翻译为:

void fun(int *arr);