常量的交换函数

           今天,我见到一道题,题目是:使用函数实现两个数的交换,还有不允许创建临时变量实现两个数的交换。

           一开始,我写的代码就是把之前在主函数的代码,写在了调用函数里,结果发现两个数的值并没有发生交换,很是神奇。

void Swap(int n, int m)
{
	int t = n;
	n = m;
	m = t;
}

            最后,我仔细看了下代码,发现,我刚才写的那串代码只是将实参的值传给调用函数的形参,而形参在执行Swap函数的时候,只是在形参中将实参的值进行了交换,但是实参的地址并没有发生改变,就造成了刚才那种情况。

            所以,想要用调用函数对两个数进行交换,就要把实参的地址进行交换,而C语言中指针类型就可以交换地址,在这里就需要给形参定义成指针变量,来接收实参的地址,并在调用函数中对实参的地址进行交换,那么就可以完成两个数的交换了。

void Swap(int* n, int* m)//使用指针变量接收实参的地址
{
	int t = *n;//初始化一个形参变量保存实参的值
	*n = *m;
	*m = t;
}
int main()
{
	int a=1,b=2;
	Swap(&a,&b);//将实参的地址传给调用的函数
	printf("a=%d b=%d\n", a, b);
	return 0;
}

      交换两个数却不仅仅有这两种方法,通过搜索和询问同学,我知道了居然还可以在不创建临时变量的情况下,还可以交换两个数,更神奇了。

#include<stdio.h>
int main()
{
	int a=1,b=2;
	a = a^b;//a=0001^0010=0011
	b = a^b;//b=0011^0010=0001
	a = a^b;//a=0011^0001=0010
	printf("a=%d b=%d\n", a, b);
	return 0;
}
#include<stdio.h>
int main()
{
	int a=1,b=2;
	a = a + b;//a=1+2=3
	b = a - b;//b=3-2=1
	a = a - b;//a=3-1=2
	printf("a=%d b=%d\n", a, b);
	return 0;
}

       这两种方法,一种是通过加减法来实现两数的交换,另一种是用异或的方式来实现交换,在这种方式中,数字是以二级制01代码来进行交换的,在运行的效率上比其他交换方法要快,因为计算机是用二进制01代码来储存和运行的,在程序的执行期间,使用异或的的方式来交换,就省去了计算机将字符转为二级制再转为字符的过程,可以节省很多时间。

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值