为什么这里的“&”表示引用?

Liu*_*uan -2 c++ reference

我正在阅读C++ Primer,当我读到以下内容时,它真的让我很困惑:

int odd[] = {1, 3, 5, 7, 9};
int even[] = {0, 2, 4, 6, 8};
//return a pointer, which points an array with 5 int
decltype(odd) *arrPtr(int i)
{
    return (i % 2) ? &odd : &even;
}

int main()
{
    cout << "odd: " << odd << endl;
    cout << "even: " << even << endl;
    cout << arrPtr(3);
}
Run Code Online (Sandbox Code Playgroud)

结果是:

odd: 0x472010
even: 0x472030
0x472010
Run Code Online (Sandbox Code Playgroud)

让我困惑的是为什么需要&。我的意思是,有必要添加“&”吗?

我尝试像这样删除&:

odd: 0x472010
even: 0x472030
0x472010
Run Code Online (Sandbox Code Playgroud)

但它就是行不通:

[Error] cannot convert 'int*' to 'int (*)[5]' in return
Run Code Online (Sandbox Code Playgroud)

这是我的想法:

它不能是“奇数地址”,因为它将成为二阶指针。 所以它一定是一个参考。(这是我的观点)

那么问题来了,为什么一定要作为参考呢?

谁能为我解释一下吗?欢迎任何答案。多谢。

Chr*_*sMM 6

decltype(odd) *arrPtr(int i)
Run Code Online (Sandbox Code Playgroud)

这行代码表示您将返回一个指向int大小为 5 的数组的指针。

当你这样做时

return (i % 2) ? odd : even;
Run Code Online (Sandbox Code Playgroud)

您试图返回一个int大小为 5 的数组,而不是指向它的指针。因此,&

return (i % 2) ? &odd : &even;
Run Code Online (Sandbox Code Playgroud)

odd然后获取or的地址even,并将其作为指针返回,这就是函数期望您返回的内容。

注意:在C++中,不能返回数组,但可以返回指针。

另请注意:类型,当使用&is int (*)[5]、 not时int **,函数的返回类型本质上是int (*)[5]、 notint *

另请注意:正如下面的注释中所述,通常来说,如果您只想返回整数数组,则可以使用 的返回类型int *。返回时Anint[5]将被隐式转换为 a int *。使用decltype(odd)会增加复杂性。

  • @LiuYuan,不是的。使用“&amp;”时的类型是“int (*)[5]”,而不是“int **”,并且函数的返回类型是“int (*)[5]”,而不是“int *” (2认同)