故名思意传值调用和传址调用的区别,传值是把实参的值赋值给形参,那么对形参的修改是不会影响实参的值的。传址是一种特殊的方式,它传递的是地址,让形参和实参同时指向一块内存区域,形参的变动也会影响实参。
我们举个简单的例子吧,也就是我们最熟悉的交换两个变量的值。
int main()
{
int a = 10;
int b = 20;
swap(a, b);
printf("%d %d", a, b);
return 0;
}
基础代码我们写出来了,现在要写函数部分,我们分别展示传值和传址的使用区别和结果差异
传值调用:
//传值调用
void swap(int x, int y)
{
int tmp = 0;
tmp = x;
x = y;
y = tmp;
}
int main()
{
int a = 10;
int b = 20;
swap(a, b);
printf("%d %d", a, b);
return 0;
}

很显然答案并不是我们期望的,它并没有帮我们交换,交换前和交换后结果一样。
我们打开监视窗口来看看到底发生了什么

监视告诉我们形参xy和实参ab各有各的地址。虽然x和y确实交换了,但x和y是形参,并不会影响a和b,所以a和b没有任何变化。
传址调用:
//传址调用
void swap(int* pa, int* pb)
{
int tmp = 0;
tmp = *pa;
*pa = *pb;
*pb = tmp;
}
int main()
{
int a = 10;
int b = 20;
swap(&a, &b);
printf("%d %d", a, b);
return 0;
}

交换成功,复合预期结果。那这段代码里面具体发生了什么呢

形参和实参都指向的是同一块内存空间的内容,被调函数和主调函数之间就产生了联系。
所以在以后需要在函数内部直接修改主调函数的变量时就要通过传址调用的方式
834

被折叠的 条评论
为什么被折叠?



