学习指针的目的是使用指针解决问题,那什么问题,非指针不可呢?
当要求写个函数来交换两个变量的值时,我们稍加思索,可以写成如下函数:
void Swap1(int x, int y)
{
int tmp = x;
x = y;
y = tmp;
}
那么我们来进行测试一下,观察结果是否符合预期:
这是什么情况呢?为何没有发生交换?
在看看这样是否可行:
可以发现,函数逻辑并没有任何问题,却没有产生应有的效果,下面我们通过调试来一探究竟:
a变量与b变量的内存空间与函数内部的局部变量x变量和y变量是两块不同的空间集,x变量和y变量只是得到了a变量与b变量的值,而不代表a变量和b变量:
在main函数内部,创建了a和b,a的地址是0x098fa48,b的地址是0x0098fa3,在调用Swap1函数时,将a和b传递给了Swap1函数,在Swap1函数内部创建了形参x和y接收a和b的值,但是x的地址是0x0098f964,y的地址是0x0098f968,x和y确实接收到了a和b的值,不过x的地址和a的地址不一样,y的地址和b的地址不一样,相当于x和y是独立的空间,那么在Swap1函数内部交换x和y的值,自然不会影响a和b,当Swap1函数调用结束后回到main函数,a和b的没法交换。这种调用函数的方式叫传值调用。
那该如何调用函数才能让函数直接操作a变量和b变量呢?一定想到了吧,传地址吧,这样就可以直接访问a变量和b变量了,不就直接操作了么。经思索写出如下函数:
void Swap2(int*px, int*py)
{
int tmp = 0;
tmp = *px;
*px = *py;
*py = tmp;
}
来测试看看是否符合预期:
简直完美,下面我们来看图理解一下为何可行:
传址调用,可以让函数和主调函数之间建立真正的联系,在函数内部可以修改主调函数中的变量;所以未来函数中只是需要主调函数中的变量值来实现计算,就可以采用传值调用。如果函数内部要修改主调函数中的变量的值,就需要传址调用。