传值调用&传址调用
这篇博客介绍一下传值调用和传址调用,先看以下代码:
void swap(int m, int n)
{
int temp = 0;
temp = m;
m = n;
n = temp;
}
int main()
{
int a = 10;
int b = 20;
printf("交换前a=%d,b=%d\n", a, b);
swap(a, b);
printf("交换后a=%d,b=%d", a, b);
return 0;
}
对于以上代码运行后发现它并没有交换它们的值,像这样要对主调函数实参内容进行更改而不只是单纯的进行数值计算就要用到传址调用。见下图:
a和m地址不一样,b和n的地址也不一样,这样不是对实参a和b的值进行交换的。所以要进行传址调用:
void swap(int* m, int* n)
{
int temp = 0;
temp = *m;
*m = *n;
*n = temp;
}
int main()
{
int a = 10;
int b = 20;
printf("交换前a=%d,b=%d\n", a, b);
swap(&a, &b);
printf("交换后a=%d,b=%d", a, b);
return 0;
}
这样就进行了交换。其实传值调用在一些场合也是可以使用的:
int add(int m, int n)
{
int c = 0;
c = m + n;
return c;
}
int main()
{
int a = 10;
int b = 20;
add(a, b);
printf("两数之和等于%d\n", add(a, b));
return 0;
}
总结:
传值调⽤:函数可以传值调用,传值调用的时候形参是实参的一份临时拷贝,实参传递给形参的时候,形参会单独创建⼀份临时空间来接收实参,对形参的修改不影响实参,进而实参和形参的地址是不一样的,不会真正意义上的访问主调函数中的参数值,只是拿来使用。
传址调⽤:函数可以传址调用,传址调用的时候,可以通过形参操作实参,
利用地址关系,更加明确它的具体形式,可以让函数和主调函数之间建⽴真正的联系,在函数内部可以修改主调函数中的变量;所 以未来函数中只是需要主调函数中的变量值来实现计算,就可以采⽤传值调⽤。如果函数内部要修改 主调函数中的变量的值,就需要传址调⽤。