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

使用自定义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的意图),原函数执行过程如下:

  1. 初始数组w = [1,2,3,4],*x = w[0] = 1,*y = w[1] = 2
  2. temp = arr[*x] = arr[1] = 2
  3. *x = arr[*y] = arr[2] = 3 → w[0]被修改为3
  4. *y = temp = 2 → w[1]保持2不变
    最终数组变为[3,2,3,4],和你得到的结果一致。

内容的提问来源于stack exchange,提问作者Henok Getachew

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 00:30:44