今天,我见到一道题,题目是:使用函数实现两个数的交换,还有不允许创建临时变量实现两个数的交换。
一开始,我写的代码就是把之前在主函数的代码,写在了调用函数里,结果发现两个数的值并没有发生交换,很是神奇。
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代码来储存和运行的,在程序的执行期间,使用异或的的方式来交换,就省去了计算机将字符转为二级制再转为字符的过程,可以节省很多时间。