数组在函数中作为参数传递并被访问,那么为什么从函数返回后数组的值会被修改呢?

Array is passed as an argument in function and accessed,So Why does the values of array gets modified after returning from function?

本文关键字:函数 数组 返回 修改 为什么 参数传递 访问      更新时间:2023-10-16

为什么主函数中的 arr[0] 产生与代码中用户定义函数中的 arr[0] 不同的输出?为什么 arr[0] 在主函数中给出输出 5?

我尝试通过指针来理解它,但仍然没有得到。

void fun(int a[]){
a=a+1;
cout<<a[0]<<" ";}
int main(){
int arr[3]={5,10,15};
fun(arr);
cout<<arr[0]<<" ";
cout<<arr[1]<<" ";
return 0;}
I expect output to be 10 10 15,but the actual output is 10 5 10

在你的函数中,a是一个指针。在您的程序中,a指向arr的第一个元素。您递增a所以现在它指向arr的第二个元素。到目前为止,如此简单。

但是a的变化对arr根本没有影响。arr仍然是三个元素的数组,fun发生的任何情况都不会改变这一点。

注意:我们不能有数组类型的参数,因为数组不会被复制。数组类型的参数会自动转换为指针。这并不意味着数组类型总是转换为指针类型。根据上下文,数组类型"有时"会隐式转换为指针类型。C++入门书中有一些关于这个主题的非常好的示例:

// despite appearances, these three 
// declarations of print are equivalent
// each function has a single
// parameter   of type const int*
void print(const int*);
void print(const int[]); 
// shows the intent that the function 
// takes an array
void print(const int[10]); 
// dimension for documentation
//purposes (at best)

当你这样做a = a + 1;你实际上是在有趣的函数的本地范围内推进数组指针。数组不会在函数参数中复制。所以只有数组指针会被"复制"。但是,本地数组指针将是指向同一对象的不同指针。然后前进该指针,这不会影响实际的数组指针。我认为您缺乏有关指针算术和内置数组的隐式指针转换行为的知识。

int arr [n];被隐式转换为int *arr;。请注意,下标内的大小n实际上是内置数组声明的一部分。内置数组隐式创建指向第一个元素的指针。然后你说a= a +1;这相当于说你的数组指针的"本地副本"指向arr[1]。 你在有趣的函数的指针中执行所有这些操作,指针是实际传递的参数的副本,它本身是一个不同的指针。对该指针的任何更改都不会按预期影响实际数组指针对象。

您可以*arr = *arr + 5;arr[0] = arr[0] + 5;将 5 实际添加到第一个元素中,使其成为 10。

您的代码创建数组:a[0]=5, a[1]=10, a[2]=15.当你调用fun(arr)时,它会传入数组(指向数组的指针,该指针指向数组中的第一个值:5)。 有趣的是,"a=a+1"将指针移动到数组的第二个值:10。打印 a[0] 会打印出 10,因为这是数组指向的内容。数组本身中的值不会更改。当您返回时,您打印出 a[0] 和 a[1],其中 5 和 10。在主数组变量 a 没有移动。