为什么C语言循环内调用自定义swap函数无法完成元素交换?
问题根因
你定义的swap函数采用了C语言默认的值传递参数规则:
- 形参
int x、int y是函数内部的局部变量,调用swap(array[j], array[j + 1])时,仅会将两个数组元素的值拷贝给x、y,形参和原数组元素占用完全独立的内存空间。 - 函数内部对x、y的交换操作仅修改了局部副本的值,函数执行结束后局部变量随栈帧销毁,原数组的元素没有发生任何修改,因此交换逻辑不生效。
直接在循环内写交换逻辑能生效的原因是,操作的是原数组元素对应的内存空间,没有经过参数拷贝环节,修改会直接作用到数组本身。
正确的swap函数实现方案
方案1:传指针实现址传递(C/C++通用)
void swap(int *x, int *y) { int tmp = *x; *x = *y; *y = tmp; } // 调用时需传入数组元素的地址 swap(&array[j], &array[j + 1]);
方案2:引用传递(仅C++环境支持)
void swap(int &x, int &y) { int tmp = x; x = y; y = tmp; } // 调用方式和原有写法一致 swap(array[j], array[j + 1]);
内容的提问来源于stack exchange,提问作者シアン
相关产品推荐
相关产品推荐

