使用自定义swapp函数交换C++数组元素时结果异常求助
问题分析与解决方案
你的代码存在两个核心问题,导致结果不符合预期:
1. 自定义swapp函数逻辑完全错误
你想要交换数组中指定索引位置的元素,但当前函数的逻辑是修改指针指向的数组元素本身的值,而非交换对应索引的元素:
- 函数中
*x是传入的数组元素的值(比如调用&w[0]时,*x就是w[0]的初始值1),你把它当作数组索引去取arr[*x],完全偏离了交换元素的目标。 - 后续的
*x = arr[*y]和*y = temp是直接修改传入的数组元素的值,不是交换两个索引位置的元素。
2. 函数调用参数错误
你本想交换索引0和1的元素,但代码中却传入了&w[0]和&w[2](对应数组第0个和第2个元素的地址),即使函数逻辑正确,也会交换错误的元素。
正确实现方式
根据你的需求,提供两种常见的正确写法:
方式一:通过索引交换数组元素
直接传入数组和要交换的两个索引值,函数内部交换对应位置的元素:
#include <iostream> using namespace std; // 接收数组、两个要交换的索引 void swapp(int arr[], int idx1, int idx2) { int temp = arr[idx1]; arr[idx1] = arr[idx2]; arr[idx2] = temp; } int main() { int w[] = {1,2,3,4}; // 交换索引0和1的元素 swapp(w, 0, 1); for (int i = 0; i < 4; i++) { cout << w[i] << " "; } // 输出:2 1 3 4 return 0; }
方式二:通过指针交换数组元素
如果想用指针实现,直接传入两个要交换的元素的地址,不需要数组参数:
#include <iostream> using namespace std; // 直接接收两个元素的指针,交换它们的值 void swapp(int *a, int *b) { int temp = *a; *a = *b; *b = temp; } int main() { int w[] = {1,2,3,4}; // 交换索引0和1的元素,传入这两个元素的地址 swapp(&w[0], &w[1]); for (int i = 0; i < 4; i++) { cout << w[i] << " "; } // 输出:2 1 3 4 return 0; }
原代码为何得到3,2,3,4?
假设你实际调用的是swapp(w, &w[0], &w[1])(符合交换0和1的意图),原函数执行过程如下:
- 初始数组
w = [1,2,3,4],*x = w[0] = 1,*y = w[1] = 2 temp = arr[*x] = arr[1] = 2*x = arr[*y] = arr[2] = 3→w[0]被修改为3*y = temp = 2→w[1]保持2不变
最终数组变为[3,2,3,4],和你得到的结果一致。
内容的提问来源于stack exchange,提问作者Henok Getachew
相关产品推荐
相关产品推荐

