一、利用第三个变量交换
1.错误的交换函数及原因
void swap1 (int x, int y)
{
int z = 0;
z = x;
x = y;
y = z;
}
int a = 10;
int b = 20;
printf("交换前:a=%d,b=%d\n",a,b);
swap1(a, b);
printf("swap1交换后:a=%d,b=%d\n",a,b);
原因:传值调用函数,不可以改变实参的值。形参是实参的一份临时调用。
调用swap1(a,b)-> 内存中又开辟了两个新的空间x和y -> 将a中的值10传给x,将b中的值20传给y -> 在swap1函数内部将x和y的值进行交换 -> 函数调用结束,形参消失 -> 只是将传过去的形参的值进行了交换,实际上a和b的值并没有被交换
2.正确的交换函数
void swap2 (int* pa,int* pb)
{
int z = 0;
z = *pa;
*pa = *pb;
*pb = z;
}
int a = 10;
int b = 20;
printf("交换前:a=%d,b=%d\n",a,b);
swap2(&a, &b);
printf("swap2交换后:a=%d,b=%d\n",a,b);
原因:传址调用函数,可以改变实参的值。可以通过形参操作实参。
调用swap2(a,b)-> 内存中又开辟了两个新的空间pa和pb -> 将a的地址传给pa,将b的地址传给pb -> swap2函数内部通过*pa找到a,通过*pb找到b,在借助z将*pa和*pb的值交换(即将a和b的值借助z交换) -> 函数调用结束,a和b的值被交换
总结:函数内部想改变(操作)函数外面 -> 传址调用
只是想使用一下这个值 -> 传值调用
二、不利用第三个变量交换
利用按位异或来进行交换
void swap (int* a,int* b)
{
*a = *a^*b;
*b = *a^*b;
*a = *a^*b;
}
int a = 3;
int b = 5;
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);