C语言使用函数交换两个数的值
C语言用函数交换两个数的值
·
代码分析
下面先举两个常见的错误例子
例一
#include <stdio.h>
void change(int a, int b);
int main()
{
int a = 1;
int b = 2;
printf("交换前: %d %d\n", a, b);//1 2
change(a, b);
printf("交换后: %d %d\n", a, b);//1 2
}
void change(int a, int b)
{
int temp = 0;
temp = a;
a = b;
b = temp;
}
这段代码是无法达成交换main函数中a和b的值的目的的,下面我们来分析一下原因。
图一:进入change函数前a和b各自的地址和值
图二:在执行完change函数后a和b各自的地址和值(仍在change函数中)
由图可知,在main函数和change函数中,a和b的地址是不同的,也就是说在执行语句change(a, b)时,我们是在change函数中创造了新的变量a和b,并将main函数中a和b的值赋给change中的a和b,所以,无论change函数中的a和b如何操作,对main函数中的a和b都没有任何的影响。
例二
#include <stdio.h>
void change(int* a, int* b);
int main()
{
int a = 1;
int b = 2;
printf("交换前: %d %d\n", a, b);
change(&a, &b);
printf("交换后: %d %d\n", a, b);
}
void change(int* a, int* b)
{
int* temp = 0;
temp = a;
a = b;
b = temp;
}
相较于例一来说,例二完成了地址的传递,只是在交换时,没有进行解引用,仅仅只在交换地址
图三:执行change语句前a和b各自的地址和值
图四:执行完change函数后a和b各自的地址和值(仍在change函数中)
注意这里和例一不同的是,例一传入change函数的是a和b的值,而例二传入的是a和b的地址。但是我们也仅仅是在change函数中创造了新的指针a和b,用于存放a和b的地址。我们是可以通过地址来改变main函数中a和b的值的,但需要有解引用(*)来操作。在例二中并没有这种操作,只是单纯的对change函数中a和b的值(即main函数中a和b的地址)进行了交换,不会影响到main函数中a和b。
正确写法
#include <stdio.h>
void change(int* a, int* b);
int main()
{
int a = 1;
int b = 2;
printf("交换前: %d %d\n", a, b);
change(&a, &b);
printf("交换后: %d %d\n", a, b);
}
void change(int* a, int* b)
{
int temp = 0;
temp = *a;
*a = *b;
*b = temp;
}
该方法在change函数中创造了新的指针a和b,用于存放a和b的地址。并通过解引用对main函数中的a和b的值进行了交换。
更多推荐
已为社区贡献2条内容
所有评论(0)