我试图理解以下两段代码之间的区别:
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 非常相似。为什么一个有效而另一个无效?
最佳答案
有点令人迷惑的是,你可以声明一个函数来接受一个函数作为参数(尽管这没有任何意义),其效果是使参数成为一个函数指针。这类似于声明一个看起来像数组但实际上是指针的函数参数的方式。
函数参数可以是函数名,带或不带 &
明确获取其地址。如果省略 &
,然后有一个隐式函数到指针的转换。同样,这类似于传递一个(指向)数组的指针,其中隐式数组到指针的转换意味着您只需要写数组的名称,而不是 &array[0]
。 .
声明变量时该规则不适用; int goo(int);
(在 goo
周围有或没有不必要的括号)声明一个函数,而不是一个指针,并且您不能分配给函数。
关于c++ - 函数类型与函数指针类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23219227/