传值调用
传值调用相关代码及用法
传值调用代码
void print(int x, int y)
{
if (x > y)
{
printf("%d\n", x);
}
else
{
printf("%d\n", y);
}
return 0;
}
int main()
{
int i = 0;
int j = 0;
i = 10;
j = 20;
print(i, j);
}
传值调用用法
上面代码是比较两个数大小,利用print函数实现。通过主函数的i、j数值传送到print函数的x、y接收。其中主函数里面的i、j称为实参,而print函数里面的x、y称为形参,形参只是实参的一份临时拷贝。
传址调用
传址调用相关代码及用法
传址调用代码
void Swap(int* x, int* y)
{
int 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);
return 0;
}
传址调用用法
上面代码是交换两个数的数值,利用Swap函数实现。通过主函数传递a、b地址到Swap函数的int* x、int* y接收。通过传送实参地址给实参,来交换两个数的数值。
传值调用代码用传值调用实现的可能
通过上面的代码讲解,我们不妨尝试使用传值调用来实现传址调用的功能
void Swap(int x, int y)
{
int z = 0;
z = x;
x = y;
y = z;
}
int main()
{
int a = 10;
int b = 20;
int c = 0;
printf("交换前:a=%d b=%d\n", a, b);
Swap(a, b);
printf("交换后:a=%d b=%d\n", a, b);
return 0;
}
代码结果如图:
我们发现传值调用并不能实现传址调用的功能。因为传值调用的时候,形参只是实参的一份临时拷贝,实参和形参是两个独立空间,在形参里面改变的值并不会影响实参。
那么如何判断什么时候用传值调用,什么时候用传址调用?(以上面传址调用代码为例)
在函数Swap想要交换函数main里面的a,b值时候,main函数需要把实参的地址传给形参次才能实现形参修改实参值。因为传址调用时候,指针能指向实参地址并实现值的改变。若是传值调用并无法改变实参值a,b,因为形参会新生成一个空间(即地址)存放实参传过来数值,形参此时进行变动只是改变形参的数据,并不会影响实参的原值,因为形参只是实参的一份临时拷贝。所以在形参不需要改变实参值时候,只需要传值即可。若需要改变实参值,即要传址调用。