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

时间:2014-03-30 09:19:35

标签: c++ function pass-by-reference

据我所知,C ++使用Ampersand(&)来制作Pass by Reference Function。但我刚测试了这段代码,我想知道为什么第二个函数与第一个函数看起来相似。看来第二个函数现在是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;
}

输出:

1
2

任何人都能解释一下这个吗?感谢。

3 个答案:

答案 0 :(得分:5)

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

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

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

考虑到参数理想地不同,它们具有不同的行为

  1. 引用变量的Sizeof返回数组的实际大小。
  2. 您无法修改函数内的参考参数。
  3. 为了完整起见,这里有一个更新的程序,可以让您更好地了解行为的不同之处。

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

答案 1 :(得分:1)

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

答案 2 :(得分:0)

默认情况下,指针传递数组,即数组的基址。 所以在f2()中,a的基址被复制到b,这样就可以以正常的指针方式从函数中访问它。

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

希望它有所帮助...