C语言小程序--交换两个变量的值



看到这个题目首先我们可以想到借助一个第三变量来实现

例如: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;
}




  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值