看到这个题目首先我们可以想到借助一个第三变量来实现
例如:a=10,b=20 我们想要交换a与b的值,可以借助一个第三变量temp,把a的值附给temp,把b的值给a,再把temp的值给b,就完成了交换。
起初我们可能写出这样的代码:
#include<stdio.h>
swap_num(int x, int y)
{
int tmp = x;
x = y;
y = tmp;
}
int main()
{
int a = 10, b = 20;
printf("交换前 a = %d,b = %d \n", a, b);
swap_num(a, b);
printf("交换后 a = %d,b = %d \n", a, b);
system("pause");
return 0;
}
这段代码看似正确,但是它到底能不能得到我们想要的结果呢?运行一下就知道
咦~没有交换,这是为什么呢?我们来看下内存窗口,看看到底哪里出错了吧!
这里我们可以看到x和y的值确实交换了,但是我们发现a与x,b与y的地址并不相同,这是因为在c中函数的所有参数均已“传值调用”的方式进行传递。也就是说,我们刚刚在swap_num函数中的参数x和y只是我们要交换的数据a和b的一份临时拷贝,而我们真正想要交换的值并没有进行交换。
那我们应该如何正确地实现两个函数的交换呢?为了达到访问调用程序的值,我们必须给函数传递希望修改值的地址,这样函数便可以通过这个地址找出要修改的值,并对其进行修改了。因此我们对上面的程序做了如下改进:
#include<stdio.h>
swap_num(int *x, int *y)
{
int tmp =*x;
*x =* y;
*y = tmp;
}
int main()
{
int a = 10, b = 20;
printf("交换前 a = %d,b = %d \n", a, b);
swap_num(&a, &b);
printf("交换后 a = %d,b = %d \n", a, b);
system("pause");
return 0;
}
这次程序会得到我们想要的结果吗?验证一下就知道啦~
再查看下内存窗口,会发现这x和y中分别保存的是a和b的地址,在函数调用完成后a和b的值也发生了变化
这种方法就是我们常说的函数中的“传址调用”。
上面的方法做出来以后,我们又想有没有办法不使用中间变量就交换两个变量的值呢?稍加思考,其实这个也不难,我们可以借助数学中的加减运算来实现。
例如:a=10,b=20 令 a=a+b; 把a-b赋给b(注意:此处的a是重新赋值后的,即 a+b),再把a-b赋给a(此处的a和b都是重新赋值后的),这样就实现了两个数的交换。
代码如下:
#include <stdio.h>
int main()
{
int a = 10, b = 20;
a = a + b;
b = a - b;
a = a - b;
printf("a =%d ,b=%d", a, b);
system("pause");
return 0;
}
因为这种方法特别简单,所以我就在主函数中写了,如果读者想要包装成函数,不要忘记要传给函数的是a和b的地址哦!
除了上述方法,还可以使用异或运算来实现两个变量的值交换
具体实现如下:
#include <stdio.h>
int main()
{
int a = 10, b = 20;
printf("交换前a = %d,b = %d \n", a, b);
a = a^b;
b = a^b;
a = a^b;
printf("交换后 a = %d,b = %d \n", a, b);
system("pause");
return 0;
}