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

为何main函数中int i与int j的值未实现交换?

问题核心:你交换的是指针的指向,不是变量的值

你的swap函数并没有修改i和j这两个变量内存中的实际值,而是交换了指针变量p和q的指向。

具体分析

在main里,p初始指向i(&i),q初始指向j(&j)。调用swap((void **)&p, (void **)&q)时,你把p和q的地址传给了swap的a和b参数:

  • *a就是p的值(也就是&i),*b就是q的值(也就是&j)
  • 你在swap里执行t=*a; *a=*b; *b=t,本质是把p的值改成&j,q的值改成&i——这只是让p和q互相指向了对方的变量,但i和j本身的内存数据(3和5)完全没被修改。

你在swap里打印的*a和*b地址变化,其实是p和q的指向变了,而i和j的地址(&i、&j)从始至终都没改变过,它们的值自然也不会变。

要交换i和j的值,该怎么改?

如果你目标是交换i和j的实际值,有两种简单方式:

方式1:直接交换int变量的内容(最直观)

#include <stdio.h>

void swap(int *a, int *b)
{
    int t = *a;
    *a = *b;
    *b = t;
}

int main()
{
    int i = 3;
    int j = 5;

    printf("-org i = %d , j = %d\n",i,j);
    swap(&i, &j); // 传递i和j的地址
    printf("-mod i = %d , j = %d\n",i,j);

    return 0;
}

方式2:如果一定要用void**(没必要,但可以实现)

如果你坚持要用void**的写法,需要在swap里解引用到int*,然后修改对应地址的内容:

#include <stdio.h>

void swap(void **a, void **b)
{
    // 先把void*转成int*,再交换它们指向的内容
    int t = *(int*)*a;
    *(int*)*a = *(int*)*b;
    *(int*)*b = t;
}

int main()
{
    int i = 3;
    int j = 5;
    int *p = &i;
    int *q = &j;

    printf("-org i = %d , j = %d\n",i,j);
    swap((void **)&p, (void **)&q);
    printf("-mod i = %d , j = %d\n",i,j);

    return 0;
}

验证结果

修改后,main里打印的i和j就会变成5和3,达到你预期的交换效果。

内容的提问来源于stack exchange,提问作者陳連城

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 23:12:01