初学函数调用的时候就遇见了“交换 a, b 的值”这个程序:
int Swap(int x, int y)
{
int tmp = 0;
tmp = x;
x = y;
y = tmp;
}
int main()
{
int a;
int b;
scanf("%d%d", &a, &b);
Swap(a, b);
printf("a=%d b=%d\n", a, b);
system("pause");
return 0;
}
输入 a = 2, b = 5,发现结果并没有交换 a, b 的值:
这就是传值调用:就是将参数的值传递给函数,而函数在进行调用时会复制这个值,然后将复制的值在函数中进行调用。
a 和 b 是实际参数,x 和 y 是形式参数, 函数在调用时首先会复制 a 和 b 的值, 复制的值理论上传给了 x 和 y (xa, yb), 但是 &a != &x, &b != &y,意思就是值虽然相同,但是地址是不同的。 形参只是实参的一份临时拷贝,并不能改变实参的值。
即传值是把实参的值“拷贝”给形参,运算中是对形参进行操作,实参的值在运算中不会发生变化。
int Swap(int *x, int *y) //x=&a,y=&b指针保存了a,b的地址
{
int tmp = 0;
tmp = *x;
*x = *y;
*y = tmp;
}
int main()
{
int a;
int b;
scanf("%d%d", &a, &b);
Swap(&a, &b); //将a,b 的地址传给函数
printf("a=%d b=%d\n", a, b);
system("pause");
return 0;
}
这就是传址调用:传址就是将参数的地址传给函数进行调用。
传址是把实参的地址传给形参,运算中是对实参进行操作,会改变实参的值。