一、值传递
eg:
void Exchg1(int x, int y) /* 定义中的x,y变量被称为Exchg1函数的形式参数 */
{
int tmp;
tmp = x;
x = y;
y = tmp;
printf("x = %d, y = %d.\n", x, y);
}
int main()
{
int a = 4,b = 6;
Exchg1(a, b); /*a,b 变量为 Exchg1 函数的实际参数。*/
printf("a = %d, b = %d.\n”, a, b);
return(0);
}
输出:
a=4,b=6
理解:
函数在调用时是隐含地把实参 a、b 的值分别赋值给了 x、y,之后在你写的 Exchg1 函数体内再也没有对 a、b 进行任何的操作了。
交换的只是 x、y 变量。并不是 a、b。当然 a、b 的值没有改变啦!函数只是把 a、b 的值通过赋值传递给了 x、y,函数里头操作
的只是 x、y 的值并不是 a、b 的值。这就是所谓的参数的值传递了。
二、地址传递
void Exchg2(int *px, int *py)
{
int tmp = *px;
*px = *py;
*py = tmp;
printf("*px = %d, *py = %d.\n", *px, *py);
}
int main()
{
int a = 4;
int b = 6;
Exchg2(&a, &b);
printf("a = %d, b = %d.\n”, a, b);
return(0);
}
输出:
*px = 6, *py = 4.
a = 6, b = 4.
理解:
指针 px、py的值已经分别是 a、b 变量的地址值了。接下来,对*px、*py 的操作当然也就是对 a、b 变量本身的操作了。
所以函数里头的交换就是对 a、b 值的交换了,这就是所谓的地址传递(传递 a、b 的地址给了px、py)
三、引用传递
eg:
void Exchg3(int &x, int &y) /* 注意定义处的形式参数的格式与值传递不同 */
{
int tmp = x;
x = y;
y = tmp;
printf("x = %d, y = %d.\n", x, y);
}
int main()
{
int a = 4;
int b = 6;
Exchg3(a, b); /*注意:这里调用方式与值传递一样*/
printf("a = %d, b = %d.\n”, a, b);
}
输出:
输出结果:
x = 6, y = 4.
a = 6, b = 4. /*这个输出结果与值传递不同。*/
理解:
我们先看 Exchg3 函数的定义处 Exchg3(int &x, int &y)。参数 x、 y 是 int的变量,调用时我们可以像值传递(如: Exchg1(a, b); )
一样调用函数(如: Exchg3(a, b);)。但是 x、y 前都有一个取地址符号“&”。有了这个,调用 Exchg3 时函数会将 a、b 分别代替
了 x、y 了,我们称:x、y分别引用了 a、b变量。这样函数里头操作的其实就是实参 a、b 本身了,也就是说函数里是可以直接修改
到 a、b 的值了。