[英]function type vs. function pointer type
我试图理解以下两个代码块之间的区别:
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);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.