按值发送数组作为参数?

时间:2016-10-04 09:10:57

标签: c++ arrays

我编写了一个非常简单的代码来学习c ++。我发现当我将在堆栈上创建的数组发送到另一个函数时,函数会更改源数组 - 这与其他变量不同。像int或者什么。

为什么会这样?

代码:

void ByValue(int arr[], int size)
{
    for (int i = 0; i < size; i++)
    {
      arr[i] += 1;
    }
}

void  SimpleArray()
{
    int arr[3];

    for (int i = 0; i < 3; i++)
    {
      arr[i] = i+1;
      cout << "Element [" << i << "] is " << arr[i] << endl;
    }
    cout << endl;
    ByValue(arr, 3);// <-- should be by value
    for (int i = 0; i < 3; i++)
    {
        cout << "Element after change [" << i << "] is " << arr[i] << endl;  // <-- this shouldent change ?
    } 
    cout << endl;

}

给出输出:

Element [0] is 1
Element [1] is 2
Element [2] is 3

Element after change [0] is 2
Element after change [1] is 3
Element after change [2] is 4

如果第二个输出按值传递,则第二个输出应与第一个输出相同, 但现在是否就像我使用指针一样?

2 个答案:

答案 0 :(得分:4)

实际上,ItemRelations: [ { rel: "System.Links.H-Forward", source: {id: 123456,url: "https://somename.domain.com/DefaultCollection/_apis/wit/Items/123456"}, target: {id: 231856,url: "https://somename.domain.com/DefaultCollection/_apis/wit/Items/231856"} } ] 的原型是

ByValue

即。数组衰减指针类型。因此,对数组的修改会在调用者中反映出来。

请注意,符号void ByValue(int* arr, int size) 相同*(arr + n)

答案 1 :(得分:1)

将数组传递给函数会将其衰减为指针。所以实际上在原始数组中进行了更改。 arr只是数组中第一个元素的地址。该地址正在传递给该函数。所以在函数中如果你这样做

arr[index] = value;, 它被分解为*(arr + index) = value;,它将在原始数组中进行更改arr与原始数组的第一个元素的地址相同。