一.问题
当我们想写一个函数,进行两个数的替换时,我们发现最终的运行结果并不如我们预期的那样。
代码如下:
//交换两个数
//定义一个函数,进行两个数的调换
void Swap(int x, int y)
{
int tmp = x;
x = y;
y = tmp;
}
//编写代码,调用函数
int main()
{
int a = 0;
int b = 0;
scanf("%d %d", &a, &b);
printf("交换前:%d %d\n", a, b);
//调用函数
Swap(a, b);
printf("交换后:%d %d\n", a, b);
return 0;
}
运行结果如下:
二.问题原因
//当实参传递给形参的时候
//形参是实参的一份临时拷贝
//所以对形参的修改不会影响实参
简单来说,其只对形参进行了修改,将实参拷贝到实参,进行了临时修改,对实际的参数a,b没有进行修改,还是原来的数值。
形式参数只有在函数被调用的过程中才实例化(分配内存单元)。
形式参数当函数调用完成之后就自动销毁了。因此形式参数只在函数 中有效。
我们可以通过监视窗口来了解一下。
输入数字 5 6
未执行函数时,x,y的值确实是5 6
我们可以看到,在执行完Swap函数后,x,y的值确确实实变为了6 5
但我们也可以明显看到,自始至终,a,b的值从未变过。同时,x,y,a,b的地址从始至终也不相同。对x,y的改变无法影响对a,b的改变。
由此,可以再度理解下面这段话
//当实参传递给形参的时候
//形参是实参的一份临时拷贝
//所以对形参的修改不会影响实参
三.解决方案
要找到一块内存语块,可以通过地址来找,进而联想到指针。
//交换两个数
//定义一个函数,进行两个数的调换
//*pa就是a
//*pb就是b
void Swap(int *pa, int *pb)
{
int tmp = *pa;
*pa = *pb; //a = b
*pb = tmp;//b =tmp
}
//编写代码,调用函数
int main()
{
int a = 0;
int b = 0;
scanf("%d %d", &a, &b);
printf("交换前:%d %d\n", a, b);
//调用函数,采用指针,取地址进行交换
Swap(&a, &b);
printf("交换后:%d %d\n", a, b);
return 0;
}
进而,我们就能完成自己的目标,达成交换的目的。
pa,pb通过地址找到a,b