【问题标题】:C++ - Pass by Reference, Weird Thing for ArrayC++ - 通过引用传递,数组的奇怪事物
【发布时间】:2014-05-09 15:41:47
【问题描述】:

据我所知,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

有人可以解释一下吗?谢谢。

【问题讨论】:

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


    【解决方案1】:

    当您将数组传递给函数时,它会退化为指针。所以无论哪种情况,结果都是一样的。

    所以在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;
    }
    

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • "数组名是指向数组第一个元素的指针。"数组和指针是非常不同的东西。只是数组表达式在某些上下文中可以隐式转换为指针表达式。
      【解决方案3】:

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

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

      希望对您有所帮助...

      【讨论】:

      • 谢谢,是的,它有帮助!
      猜你喜欢
      • 1970-01-01
      • 2020-07-30
      • 2012-04-17
      • 2019-06-29
      • 1970-01-01
      • 2018-09-01
      • 1970-01-01
      • 2012-05-13
      相关资源
      最近更新 更多