You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何无返回值的C++ MergeSort能正常修改原数组?

问题解答:为何这段归并排序能修改原数组

核心本质:C++数组参数的传递是指针语法糖

你看到函数参数里写的int arr[],其实是编译器提供的语法糖,实际会被解析成int* arr(指向int的指针)。当你在main里调用mergeSort(myarray, ...)时,传递的不是整个数组的副本,而是原数组myarray首元素的内存地址。

所以在mergeSort和merge函数中,所有对arr[p]的操作,都是通过指针直接访问并修改原数组myarray的内存空间,完全不需要返回值就能改变原数组的内容。

具体执行逻辑拆解

  1. 递归拆分阶段:mergeSort不断将数组拆分为左右两个子数组,直到子数组长度为1(此时l >= r,递归终止)。每一层递归传递的都是同一个数组的指针,所有操作都指向原数组的内存区域。
  2. 合并阶段: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 01:39:40