在C语言中,经常需要交换两个变量的值,那么如何去交换两个变量的值呢?方法其实是很多的。大体分为两个方面,不使用指针改变,和使用指针在自定义函数中改变。
不使用指针
这种情况在交换函数内两个局部变量的值,或者交换两个全局变量的值最为适用。
第一种是最为常用的,用第三个变量存储变量被修改之前的值。
#include <stdio.h>
int main()
{
int a=10, b=5, tmp=0;
tmp=a;
a=b;
b=tmp;
return 0;
}
第二种就少见了,不需要使用第三个变量。
#include <stdio.h>
int main()
{
int a=10, b=5;
a=a+b; //这里a的值是a+b
b=a-b; //这里b的值是(a+b)-b=a
a=a-b; //这里a的值是(a+b)-a=b
return 0;
}
第三种和第二种异曲同工,但是使用了位运算符。
#include <stdio.h>
int main()
{
int a=10, b=5;
a=a^b; //这里a的值是a^b
b=a^b; //这里b的值是(a^b)^b=a^(b^b)=a^0=a
a=a^b; //这里a的值是(a^b)^a=b^(a^a)=b^0=b
return 0;
}
使用指针
使用指针都是为了在函数内部访问函数外的局部变量,这里先说两种错误的方法,然后再说两种正确的方法。
第一种,最为常见的错误,没有理解实参和形参的区别。指针变量也是形参,交换形参指针的值,只是交换了形参指针的指向,并没有对其指向的内存做修改。
void swap1(int *pa,int *pb)
{
int *pt;
pt = pa;
pa = pb;
pb = pt;
}
第二种,避开了没有对内存做修改的错误,但是在运行过程中几乎都会报错。
void swap2(int *pa,int *pb)
{
int *pt; //这里定义一个pt指针,
//想用它指向的内存去存储变量修改前的值,
//但是对于一个没有初始化的指针(指针变量的值是随机的,即野指针),
//去访问它指向的内存是相当危险的,
//我们无法知道它指向的内存是否有权限去访问,
//以及访问过后是否会使程序崩溃,所以绝大多数情况下会出错。
*pt = *pa;
*pa = *pb;
*pb = *pt;
}
第三种是正确的方法,也是最常用的。
void swap3(int *pa,int *pb)
{
int t = 0;
t = *pa;
*pa = *pb;
*pb = t;
}
第四种是正确的方法,是使用前面所说的位运算的方法,你也可以使用加法的方法。
void swap4(int *pa,int *pb)
{
*pa ^= *pb;
*pb ^= *pa;
*pa ^= *Pb;
}
写的可能不够好哈(- _ -)