函数实现两个数交换
首先,我们来看看不使用函数,怎么实现两个数字的交换呢?
#include <stdio.h>
int main()
{
int a = 50;
int b = 100;
int temp = a;
a = b;
b = temp;
printf("a=%d b=%d\n", a, b);
system("pause");
return 0;
}
结果:a和b成功的实现了交换。
那么使用函数如何实现呢?
很多人会觉得,只需要将上面交换数字的部分放到函数中就可以了,那我们来试试:
#include <stdio.h>
void swap(int x, int y){
int temp = x;
x = y;
y = temp;
}
int main()
{
int a = 50;
int b = 100;
swap(a, b);
printf("a=%d b=%d\n", a, b);
system("pause");
return 0;
}
结果:
分析:我们可以看到,在这个代码中, a和b没有发生交换。
那么x,y发生交换了吗?
我们可以在函数中加入输出x,y值的代码看一下。
代码:
void swap(int x, int y){
int temp = x;
x = y;
y = temp;
printf("x=%d y=%d\n", x, y);
}
结果:
分析:在这个代码中我们发现,a和b没有发生交换。函数内部交换的是 x 和 y,x 和 y 相当于创建出的新的局部变量,只是通过a,b初始化了。交换 x 和 y 不会影响到 a 和 b。
原因是: 函数内部访问的x和y不是a和b的本体。
要想解决这个问题,就需要想办法让函数内部能够访问到函数外面的变量。在C语言中,我们不能直接访问函数外部的局部变量,但是 可以使用指针来间接访问外部的变量。
代码实现:
void swap(int* x, int* y){
int temp = *x;
*x = *y;
*y = temp;
}
此处的 swap 函数等价于以下代码:
int* x = &a;
int* y = &b;
int temp = *x;
*x = *y;
*y = temp;
int temp = a;
a = b;
b = temp;
printf("a = %d, b = %d\n", a, b);
在这个代码中, 先定义两个指针变量x,y,其中x保存a的地址,y保存b的地址。代表对指针的解引用,表示指针指向的目标。 所以x 就等价于 a,*y等价于,然后通过临时变量temp交换a,b。
最终的代码实现:
#include <stdio.h>
void swap(int* x, int* y){
int temp = *x;
*x = *y;
*y = temp;
}
int main()
{
int a = 50;
int b = 100;
swap(&a, &b);
printf("a=%d b=%d\n", a, b);
system("pause");
return 0;
}