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

C语言中实现变量值交换未生效,问题出在哪里?

为什么我的C语言交换变量函数没生效?

兄弟,一眼就能看出问题出在C语言的参数传递机制上!这也是新手写C代码最容易踩的坑之一。

问题根源:值传递的本质

当你在main函数里调用changevalue(a,b)时,函数里的形参a和b并不是你主函数里的那两个变量——它们是实参的副本,拥有完全独立的内存地址。你在函数里交换的只是这两个副本的值,主函数里的原始变量a和b根本没被碰过,所以两次printf输出的结果自然一模一样。

解决办法:用指针实现地址传递

要真正修改主函数里的变量,得让函数直接操作变量的内存地址,这就要用到指针。下面是修改后的完整代码:

#include <stdio.h>

// 修改为void类型(不需要返回值),参数改为指针
void changevalue(int *a, int *b) {
    int temp;
    // 解引用指针,直接操作原始变量的值
    temp = *a;
    *a = *b;
    *b = temp;
}

int main() {
    int a;
    int b;
    a = 10;
    b = 20;
    printf("交换前:a的值是%d,b的值是%d\n", a, b);
    // 传递变量的地址(&是取地址运算符)
    changevalue(&a, &b);
    printf("交换后:a的值是%d,b的值是%d\n", a, b);
    return 0;
}

代码关键修改点解释

  • 把changevalue的返回类型从int改成void:原代码里函数声明了返回int却没有return语句,会导致未定义行为,我们不需要返回值,所以用void更合理。
  • 参数改成int *a和int *b:这两个是指针变量,用来存储主函数中a和b的内存地址。
  • 使用*a和*b解引用指针:这会直接访问指针指向的内存地址中的值(也就是主函数里的原始变量),这样交换的就是真正的目标变量了。
  • 调用函数时用&a和&b:&是取地址运算符,把变量的内存地址传递给函数的指针参数。

额外小提示

除了指针,你也可以用宏定义实现交换(但要注意宏的副作用),或者通过返回结构体传递两个值,但指针是最直接高效的方式。

内容的提问来源于stack exchange,提问作者wadie el

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 13:53:11