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
相关产品推荐
相关产品推荐

