值传递
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
void Exchg1(int x, int y)
{
int tmp;
tmp = x;
x = y;
y = tmp;
printf("x = %d, y = %d\n", x, y);
}
main()
{
int a = 4,b = 6;
Exchg1(a, b);
printf("a = %d, b = %d\n", a, b);
return(0);
}
|
输出结果:
1
2
|
x = 6,y = 4
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的值。
指针传递
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
void Exchg2(int *px, int *py)
{
int tmp = *px;
*px = *py;
*py = tmp;
printf("*px = %d, *py = %d.\n", *px, *py);
}
main()
{
int a = 4;
int b = 6;
Exchg2(&a, &b);
printf("a = %d, b = %d.\n", a, b);
return(0);
}
|
输出结果:
1
2
|
*px = 6, *py = 4
a = 6, b = 4
|
指针px、py的值已经分别是a、b变量的地址值了。接下来,对px、py的操作当然也就是对a、b变量本身的操作了。所以函数里头的交换就是对a、b值的交换了,这就是所谓的地址传递(传递a、b的地址给了px、py)
引用传递
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
void Exchg3(int &x, int &y)
{
int tmp = x;
x = y;
y = tmp;
printf("x = %d,y = %d\n", x, y);
}
main()
{
int a = 4;
int b = 6;
Exchg3(a, b);
printf("a = %d, b = %d\n", a, b);
return(0);
}
|
输出结果:
1
2
|
x = 6, y = 4.
a = 6, b = 4
|
&在c语言中是取地址符号,调用Exchg3时函数会将a、b 分别代替了x、y,我们称:x、y分别引用了a、b变量。这样函数里头操作的其实就是实参a、b本身,也就是说函数里是可以直接修改到a、b的值。
注:严格来说,C语言中是没有引用传递,这是C++中语言特性,因此在.c文件中使用引用传递会导致程序编译出错。
参考资料
程序设计入门–C翁恺
《c语言程序设计》–谭浩强
《C Primer Plus》–Stephen Prata
C语言中文网
C语言教程|菜鸟教程