C++中向函数传递数组为何能直接修改原数组的值?
问题解答
这一现象是C++的数组形参自动退化特性导致的,核心原理如下:
- 函数数组形参的隐式转换:在C++的函数参数声明规则中,所有数组类型的形参都会被编译器自动调整为对应类型的指针。你代码中写的
void rvereseArray(int arr[], int start, int end),编译器实际处理后的函数签名完全等价于void rvereseArray(int* arr, int start, int end),你看起来没有显式声明指针,实际上形参本身就是指针类型。 - 数组名传参的自动退化:除了作为
sizeof、&运算符的操作数,或者用于初始化数组引用的场景外,数组名在其他场景下使用都会自动隐式转换为指向数组首元素的指针。你在main函数中传入实参arr的时候,实际传递的就是原数组的首元素地址,不会对整个数组做拷贝。 - 下标访问的本质:函数内对
arr[下标]的写法是语法糖,本质等价于*(arr + 下标),通过指针偏移直接操作原数组所在的内存空间,所以修改会直接作用在原数组上。
内容的提问来源于stack exchange,提问作者Noob101
相关产品推荐
相关产品推荐

