通过引用传递,数组的奇怪之处

C++ - Pass by Reference, Weird Thing for Array

本文关键字:数组 引用      更新时间:2023-10-16

据我所知,c++使用& &;)来传递引用函数。但是我刚刚测试了这段代码,我想知道为什么第二个函数看起来和第一个函数很相似。似乎第二个函数现在是传递引用函数。

#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;
}
输出:

1
2
谁能给我解释一下这个?谢谢。

将数组传递给函数时,它会退化为指针。因此,在任何一种情况下,结果都是相同的。

所以在f2的情况下,b是一个指针,它指向数组a开始的位置。还要记住数组索引[a[i]]和指针算术和取消引用[*(a+i)]是同义表达式。在第二种情况下,你最终更新了传递的原始数组。

现在这两个声明之间有一个微妙的区别。在f1的情况下,参数b是对原始数组a的引用,因此b仍然是具有源数组所有特性的同一个数组。对于第二个表达式,b只是一个指针,顺便指向数组a的位置。

考虑到参数在理想情况下是不同的,它们有不同的行为

    参考变量的Sizeof返回数组的实际大小。
  1. 不能在函数内部修改reference参数

为了完整起见,这里有一个更新的程序,它将给你更多关于行为如何不同的想法。

#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;
}

数组总是"通过引用传递"。数组的名称是一个指针
到数组的第一个元素。那么
中的int b[5]参数第二个函数与int* b基本相同。

数组默认由指针传递,即数组的基址。因此,在f2()中,a的基址被复制到b中,以便可以通过正常的指针方式从函数中访问它。

当你通过它的引用传递数组时,它不会占用任何额外的内存,它只是重命名它,你仍然可以以相同的方式访问该数组(通过使用给它的别名)你在最初定义它的块。