它们似乎与我的声明相同......
答案 0 :(得分:5)
两者都有效,但它们做的事情非常不同,就像引用和指针做的事情完全不同。 “非常”取决于你与谁交谈,但每个人都同意他们的不同。
int (&ref())[5];
int (*point())[5];
int (&var_ref)[5] = ref();
int (*var_point)[5] = point();
使用typedef具有相同的含义,这可能会更清楚:
typedef int int5[5];
int5& ref();
int5* point();
int5 &var_ref = ref();
int5 *var_point = point();
int5 a; // array declaration!
int5& ref() { return a; }
int5* point() { return &a; }
int main() {
cout << var_ref[0] << '\n'; // prints 0
cout << (*var_point)[0] << '\n'; // prints 0
}
注意指针的额外间接,返回并使用它。当你试图从一个切换到另一个时,你可能会把它遗漏掉,导致你收到的消息无效,但是如果没有更多的信息就无法告诉你。
答案 1 :(得分:0)
这不是一个答案,只是一些有助于讨论的代码。
static int ga[4] = { 49, 49, 42, 00 };
int (*get_ptr_ga())[4]
{
return &ga;
}
int (&get_ref_ga())[4]
{
return ga;
}
int main(int argc, char* argv[])
{
int (*p) [4] = get_ptr_ga();
int (&r) [4] = get_ref_ga();
char sz[4];
sz[0] = (*p)[2];
sz[1] = r[2];
sz[2] = '\n';
sz[3] = 0;
printf(sz);
return 0;
}
答案 2 :(得分:-1)
int &func;
是一个引用,int *func;
是一个指针。因为第一个是引用,所以需要将其初始化为int l值,如果它被声明为a
,则为int a;
,并且无法分配。后者是一个指针,如果它被声明为int*
,则可以初始化/分配另一个&a
,例如int a;
。