函数传递的方式一:值传递
void exchange(int x,int y)
{
int x = a;
int y = b;//前两步是调用函数隐含的操作
int tmp;
tmp = x;
x = y;
y = tmp;
printf("x = %d,y = %d\n",x,y);
}
main()
{
int a = 2,b= 4;
exchange(a,b);
printf("a = %d,b = %d\n",a,b);
return 0;
}
在函数调用的时候,只是把原本参数的值赋值给了函数中的形式参数。在exchange函数中操作的是形参,没有对原本函数做出操作,所以输出结果是 x = 4,y = 2 a = 2,b = 4。
函数传递的方式二:地址传递
void exchange(int *px,int *py)
{
px = &a;
py = &b;//前两步也是调用函数时候隐含的操作
int tmp;
tmp = *px;
*px = *py;
*py = tmp;
printf("*px = %d,*py = %d/n",*px,*py);
}
main()
{
int a = 2,b = 4;
exchange(a,b);
printf("a = %d,b = %d\n",a,b);
return 0;
}
这次在函数调用的时候是吧a,b的地址赋值给了px,py,所以交换的是真正的a,b变量此时输出的结果是*px = 4,*py = 2
a = 4,b =2 。
函数传递的方式三:引用传递
void exchange(int &x,int &y)//这就是我一开始最迷惑的一种,这种加取地址符号的形参
{
int tmp = x;
x = y;
y = tmp;
printf("x = %d,y = %d\n",x,y);
}
main()
{
int a = 2,b = 4;
exchange(a,b);
printf("a = %d,b = %d\n",a,b);
return 0;
}
这个取地址的引用传递虽然看起来像值传递,然而确实真正的改变原来常量的值,就像下棋一样操作的不是棋子,而是棋手。