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

  • 53
    点赞
  • 129
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Dak2n

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值