首先,咱们来看看不使用函数,怎么实现两个数字的交换呢?web
#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成功的实现了交换。
svg
那么使用函数如何实现呢?
不少人会以为,只须要将上面交换数字的部分放到函数中就能够了,那咱们来试试:函数
#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; }
结果:
spa
分析:咱们能够看到,在这个代码中, a和b没有发生交换。
那么x,y发生交换了吗?
咱们能够在函数中加入输出x,y值的代码看一下。3d
代码:指针
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。code
缘由是: 函数内部访问的x和y不是a和b的本体。xml
要想解决这个问题,就须要想办法让函数内部可以访问到函数外面的变量。在C语言中,咱们不能直接访问函数外部的局部变量,可是 能够使用指针来间接访问外部的变量。blog
代码实现:token
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; }