我编写了一个非常简单的代码来学习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
如果第二个输出按值传递,则第二个输出应与第一个输出相同, 但现在是否就像我使用指针一样?
答案 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
与原始数组的第一个元素的地址相同。