传值调用
上传统的经典代码!!!
void Swap1(int x, int y)
{
int tmp = 0;
tmp = x;
x = y;
y = tmp;
}
int main()
{
int a = 1;
int b = 2;
printf("交换前:a = %d b = %d\n", a, b);
Swap1(a, b);
printf("交换后:a = %d b = %d\n", a, b);
return 0;
}
调试解决!!!
swap函数的作用是将a和b的值调换,但是显然没有达到这种效果!根据调试来找原因,在main函数里面,在栈区创建了a,b并且在这两块空间里放了值,通过swap1函数的形参x和y接受了a和b的值,通过调试可以看出a和x是两块不同的空间,b和y是两块不同的空间,把a和b的值传过去后,只是在x和y的空间交换了,跟a和b没有关系,所以不能完成交换!!!
结论:实参传递给形参的时候,形参会单独创建⼀份临时空间来接收实参,对形参的修改不影响实参。
传址调用
上传统的经典代码!!!
void Swap2(int* px, int* py)
{
int tmp = 0;
tmp = *px;
*px = *py;
*py = tmp;
}
int main()
{
int a = 1;
int b = 2;
printf("交换前:a = %d b = %d\n", a, b);
Swap2(&a, &b);
printf("交换后:a = %d b = %d\n", a, b);
return 0;
}
调试解决!!!
通过运行可以看出,传地址调用的方式真的交换了a所在空间的内容和b所在空间的内容,通过调试可以看出,通过地址找到的空间是同一块空间,因此完成了交换!!!传址调⽤,可以让函数和主调函数之间建⽴真正的联系,在函数内部可以修改主调函数中的变量;所以未来函数中只是需要主调函数中的变量值来实现计算,就可以采⽤传值调⽤。如果函数内部要修改主调函数中的变量的值,就需要传址调⽤。
总结
传值调用:传值调用的本质是把实参复制一份,放到形参开辟的一块空间中,本质是两块空间,形参的空间和实参的空间没有任何关系。如果不该变实参的内容,则用传值调用。
传地址调用:传地址调用的本质是形参也开辟了一块空间,在形参开辟的空间中,里面存的是实参的地址,那么可以通过地址,找到实参真正的空间,进行操作改变实参的内容。
完结!!!