为何无返回值的C++ MergeSort能正常修改原数组?
问题解答:为何这段归并排序能修改原数组
核心本质:C++数组参数的传递是指针语法糖
你看到函数参数里写的int arr[],其实是编译器提供的语法糖,实际会被解析成int* arr(指向int的指针)。当你在main里调用mergeSort(myarray, ...)时,传递的不是整个数组的副本,而是原数组myarray首元素的内存地址。
所以在mergeSort和merge函数中,所有对arr[p]的操作,都是通过指针直接访问并修改原数组myarray的内存空间,完全不需要返回值就能改变原数组的内容。
具体执行逻辑拆解
- 递归拆分阶段:
mergeSort不断将数组拆分为左右两个子数组,直到子数组长度为1(此时l >= r,递归终止)。每一层递归传递的都是同一个数组的指针,所有操作都指向原数组的内存区域。 - 合并阶段:
merge函数先创建临时数组temp,把左右两个有序子数组合并到temp中,最后通过arr[p] = temp[p],将有序内容直接写回原数组的对应位置——这一步就是通过指针直接修改原数组的元素。
代码细节补充
- 代码里的
temp[5]是固定长度的数组,属于硬编码问题:如果原数组长度不是5,这段代码会出现越界错误。更合理的写法是根据当前合并区间的长度动态分配空间,比如int* temp = new int[r - l + 1];,使用完记得用delete[] temp;释放内存。 main里的return 0是C++程序的标准返回值,仅用于告知操作系统程序正常结束,和数组修改逻辑无关。
内容的提问来源于stack exchange,提问作者grncds
相关产品推荐
相关产品推荐

