【问题标题】:Pass array by reference and modify values C++通过引用传递数组并修改值 C++
【发布时间】:2015-05-19 12:41:04
【问题描述】:

我想编写一个函数,它接受 inArray[3] = {1,2,3,4} 和一个 outArray[3],并在函数中修改 outArray[3] 以现在包含值 = {3,4,1,2}。

int main{
 int inArray[4] = {1,2,3,4};
 int outArray[4];

 myFunction(&inArray, &outArray);
}

void myFunction(&inArray, &outArray){
  outArray[0] = inArray[2];
  outArray[1] = inArray[3];
  outArray[2] = inArray[0];
  outArray[3] = inArray[1];
}

我在这里做错了,我不完全理解如何通过引用传递数组并操作函数内部的值。

【问题讨论】:

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


    【解决方案1】:

    函数及其调用如下所示

    const size_t N = 4;
    
    void myFunction( int ( &inArray )[N], int ( &outArray )[N] )
    {
      outArray[0] = inArray[2];
      outArray[1] = inArray[3];
      outArray[2] = inArray[0];
      outArray[3] = inArray[1];
    }
    
    int main()
    {
     int inArray[N] = {1,2,3,4};
     int outArray[N];
    
     myFunction( inArray, outArray );
    }
    

    考虑到您对数组的定义

    int inArray[3] = {1,2,3,4};
    

    包含拼写错误,不会被编译。至少要有like

    int inArray[4] = {1,2,3,4};
    

    int inArray[] = {1,2,3,4};
    

    【讨论】:

    • 非常感谢!我在您发布之前纠正了错字,因此道歉,如果现在看起来很奇怪。将在 5 分钟内接受答复。
    【解决方案2】:

    您的数组大小为 3,但您尝试在其中存储 4 个元素并访问位于 [3] 的第四个元素(具有未定义的行为)。

    使它们更大,硬编码 4 或使所有内容自动调整为您用于初始化 inArray 的数字列表的当前长度:

    int inArray[] = {1,2,3,4};  // automatically sized
    int outArray[sizeof inArray / sizeof *inArray];
    

    然后,您的函数签名应指定参数的数组int。有很多方法可以做到这一点:

    void myFunction(const int inArray[], int outArray[])         // 1
    void myFunction(const int* inArray, int* outArray)           // 2
    void myFunction(const int (&inArray)[4], int (&outArray)[4]) // 3
    template <size_t N>
    void myFunction(const int (&inArray)[N], int (&outArray)[N]) // 4
    
    • 第一个显然是最简单的。

    • 第二个是等效的,因为当调用者传递数组参数时,它们被允许衰减为指针,即使对于 1) 也会发生这种情况,因为只有在通过引用接受数组时才能捕获或强制执行数组维度,如以下情况...

    • 第三个额外确保数组参数正好有 4 个元素(所以突然之间你不能(轻松)传递一个包含 10 个元素的数组并让它只复制前 4 个元素)。

      1234563

    由于您对元素 [0][3] 的函数体进行硬编码操作,因此它不会调整以对更大数组中的元素执行操作,但您可以选择在函数体来计算要操作多少个元素。

    【讨论】:

      【解决方案3】:

      数组总是通过引用传递,无需手动通过引用传递。

      【讨论】:

      • 但是通过引用传递它们需要 OP 不知道的语法,否则他们不会询问。
      猜你喜欢
      • 1970-01-01
      • 2015-04-04
      • 1970-01-01
      • 2010-09-23
      • 1970-01-01
      • 2020-07-30
      • 2012-04-17
      • 2019-06-29
      相关资源
      最近更新 更多