数组在函数中作为参数传递并被访问,那么为什么从函数返回后数组的值会被修改呢?
Array is passed as an argument in function and accessed,So Why does the values of array gets modified after returning from function?
为什么主函数中的 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 没有移动。
- 第 i 个元素返回 i 的函数数组
- 使用嵌套函数数组是个好主意吗?
- 正确实现类函数数组
- 试图引用已删除函数数组的相等运算符
- 如何在静态函数中使用成员函数数组
- 无法创建函数数组
- 构造函数数组
- 使用开关或定义函数数组 - 更快
- 编写一个函数,该函数将覆盖主函数数组中的值
- 可以像'funs[1]();'一样调用的函数数组
- std::AVX内部函数数组
- 如果数组大小未知,如何将函数数组作为参数传递
- 从函数数组中获取值
- 使用元编程在编译时初始化函数数组
- 将C函数数组转换为C++函数指针数组
- 复制构造函数 [数组] C++
- 添加函数数组并随机选择其中一个
- 指针到私有成员函数数组
- 可以单独声明函数数组的元素
- (c++)将main中的随机值保存到函数数组中