C语言中常常遇到需要交换两个值的情况,一般情况下,惯性思维引导我们:
void swap(int a,int b)
{
int temp;
temp = a;
a = b;
b =temp;
}
实际运行结果就是,不能交换值。原因在于,函数中传递的参数是形参,相当于一个临时变量。
void main()
{
int x,y;
x = 5;
y = 3;
swap(x,y);
printf("%d %d",a,b);
}
以上函数运行的详细过程:
x = 5,y = 3;
swap(5,3);
{
temp = 5;
temp_x = 3
temp_y = temp = 5;
}
// 退出函数,销毁临时变量
x = 5,y = 3;
正确的方法是,交换两个变量的地址。我们在定义变量时,实际上在计算机的物理地址空间里开辟了一块区域,用于存放当前变量的值,而这些内存区域是有编号的,我们理解为地址。在C语言中,用“*”代表指针变量,指针指向变量的地址。所以正确的交换函数写法如下:
void swap(int* a, int* b) // 输入两个指针变量
{
int tmp = *a;
*a = *b;
*b = tmp;
}
那么,最关键的在于使用取地址符“&”,完成函数的调用,因为swap函数的形参是指针类型,指针指向地址。
int main()
{
int x, y;
x = 5;
y = 3;
swap(&x, &y); // 取地址
printf("%d %d",x, y);
}