C++ - 通过引用传递,奇怪的数组

ste*_*ytw 1 c++ function pass-by-reference

据我所知,C++使用Ampersand(&)来制作Pass By Reference函数.但我刚测试了这段代码,我想知道为什么第二个函数与第一个函数看起来相似.现在似乎第二个功能是Pass by Reference Function.

#include <iostream>
using namespace std;

void f1(int (&b)[5])
{
    b[0]=1;
}

void f2(int b[5])
{
    b[1]=2;
}

int main()
{
    int a[5];
    f1(a);
    f2(a);

    cout<<a[0]<<endl;
    cout<<a[1]<<endl;
}
Run Code Online (Sandbox Code Playgroud)

输出:

1
2
Run Code Online (Sandbox Code Playgroud)

有人可以解释一下这个吗?谢谢.

Abh*_*jit 5

将数组传递给函数时,它会退化为指针.所以在任何一种情况下,结果都是一样的.

因此,如果是f2,b则指针指向数组a的相同位置.还记得数组索引[ a[i]]和指针算术和解引用[ *(a+i)]是同义表达式.因此,在第二种情况下,您最终会更新传递的原始数组.

现在两个声明之间存在细微差别.在这种情况下f1,参数b是对原始数组的引用a,因此b仍然是具有源数组的所有特征的相同数组.在第二个表达式的情况下,b只是一个偶然指向数组位置的指针a.

考虑到参数在理想上不同的事实,它们具有不同的行为

  1. 引用变量的sizeof返回数组的实际大小.
  2. 您无法修改函数内的引用参数.

为了完整起见,这里有一个更新的程序,可以让您更好地了解行为的不同之处.

#include <iostream>
using namespace std;

void f1(int (&b)[5])
{
    std::cout<<sizeof(b)<<std::endl;
    //b = new int[5]; -- Will give compile error
    b[0]=1;
}

void f2(int b[5])
{
    std::cout<<sizeof(b)<<std::endl;
    //b = new int[5]; -- Will compile fine
    b[1]=2;
}
int main()
{
    int a[5];
    f1(a);
    f2(a);

    cout<<a[0]<<endl;
    cout<<a[1]<<endl;
}
Run Code Online (Sandbox Code Playgroud)