代码分析

下面先举两个常见的错误例子

例一

#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的值进行了交换。

Logo

助力广东及东莞地区开发者,代码托管、在线学习与竞赛、技术交流与分享、资源共享、职业发展,成为松山湖开发者首选的工作与学习平台

更多推荐