前言
在之前的学习当中,我们介绍了函数的基本概念,学习了库函数和自定义函数,今天我们来带大家进行一下小小的练习,使用函数实现交换两个整形变量的值。
如何交换两个整形变量的值
当我们有两个整形变量时,如何交换他们的值呢,直接进行赋值肯定不行,我们需要引入第三个变量,用于暂时存储变量,我们用一个图来向大家介绍这个过程。
如图,其实这个过程很像我们将酱油瓶子和醋瓶子调换的过程,我们不能直接将酱油倒入醋瓶中,我们需要一个空瓶子做一个过度,先将醋倒入空瓶中,再将酱油倒入醋瓶,最后让空瓶中的醋倒入酱油瓶,如果你可以理解这个过程,那么只需要将醋和酱油换成我们的两个整形变量就可以了,是不是很好理解。
第一次尝试
我们话不多说,知道了这个过程我们直接在编译器中进行代码的编写
#include<stdio.h>
void Swap(int x, int y)
{
int z = 0;
z = x;
x = y;
y = z;
}
int main()
{
int a = 10;
int b = 20;
printf("交换前:a=%d b=%d\n", a, b);
Swap(a, b);
printf("交换前:a=%d b=%d\n", a, b);
}
我们在主函数当中定义了两个变量,在他们交换前我们进行一次打印,之后调用自定义函数Swap,Swap是我们定义的函数,返回值为空,参数为int x,int y
,在自定义函数中我们进行刚才讲解的逻辑的编写,之后在主函数中再次打印交换后的两个变量的值。我们自认为我们的逻辑完美无缺,但是我们运行起来看一下结果
我们发现当我们打印交换前后两个变量的值时竟然获得了两个一样的结果,两个变量并没有进行交换,说明我们的自定义函数没有完成任务,出现了问题我们需要在调试中寻找答案,到底是哪一步出现了问题。
错误分析
我们在编译器中进行调试找出问题
我们发现当我们从主函数进入自定义函数后,确确实实将我们在主函数当中创建的两个变量的值传递给了函数的参数x,y,,但是我们发现变量a与b是在主函数中创建的而函数中的x与y是在函数中创建的,我们可以看出内存中存储四个变量的空间的地址值是不一样的,可以说他们的储存空间是独立的,所以我们把x与y交换了半天与我们需要进行交换的a与b没有半毛钱关系。我们在继续调试验证我们的想法
我们看到x与y的值进行了交换,而a与b的值没有任何变化,那么说明我们的想法是正确的,出现这种问题的专业说法是当函数调用的时候,实参传给形参时,形参将是实参的一份临时拷贝,所以对形参的修改是不影响实参的,那么如何解决这样的问题呢?
解决方法
调用函数和主函数内的变量没有关系,我们如何让他们产生联系呢?我们可以使用指针来解决
void Swap(int* pa, int* pb)
{
int z = 0;
z = *pa;
*pa = *pb;
*pb = z;
}
int main()
{
int a = 10;
int b = 20;
printf("交换前:a=%d b=%d\n", a, b);
Swap(&a,&b);
printf("交换前:a=%d b=%d\n", a, b);
}
我们使用指针变量作用自定义函数Swap
的参数,将a与b的地址传给函数Swap
,这样就可以使Swap
内外有了联系,让自定义函数内的操作对主函数中的变量产生影响。这样就可以实现我们使用函数实现交换两个整形变量的值,我们将这样的方法称为传址调用。
传址调用使把函数外部创建变量的内存地址传递传递给函数参数的一种调用函数的方法
这种传参方式可以让函数和函数外部的变量建立真正的联系,也就是函数内部可以直接操作函数外部的变量
关于这些问题我们在之后的分享中与大家详细分享。