最近看到这样一段关于函数传递的代码:
void Exchange(int x, int y)
{
int z;
z=x;
x=y;
y=z;
}
void main()
{
int x=1, y=2;
Exchange(x, y);
printf("x=%d\ty=%d", x, y);
}
定义的子函数Exchange()目标是实现两个值的交换,然而printf输出的结果却是 ……
这就很尴尬了,说好的交换呢!!我的printf是不是出bug啦!……
于是我们在Exchange()中加入printf("x=%d\ty=%d\n", x, y);查查问题出在哪
void Exchange(int x, int y)
{
int z;
z=x;
x=y;
y=z;
printf("x=%d\ty=%d\n", x, y);
}
然后我们输出,原来子函数Exchange()中的x和y发生了交换,而main()函数中的x,y却并没有发生变化。
大家都是x, y为什么结果却不一样呐!好吧,我的printf是不是又出bug啦!……
当然不是啦!如果把子函数Exchange中的x, y换成a, b就好理解一些。
void Exchange(int a, int b)
{
int z;
z=a;
a=b;
b=z;
}
在这里其实就是把x, y的值赋给了a, b,之后在子函数Exchange()中的操作对于x, y没有任何影响,发生改变的就只有a, b而已,其实可以把代码理解成这样:
void Exchange(int a, int b)
{
int z;
a=x;
b=y; //理解成x, y把值赋给了a, b
z=a;
a=b;
b=z;
}
这样是不是清楚很多呢。而且函数的返回值只有一个,这样做也是一定不对滴~
这其实就是函数的值传递啦;
那我们换一种方式试试……
void Exchange(int *a, int *b)
{
int c = *a;
*a = *b;
*b = c;
printf("a = %d\tb = %d\n", *a, *b);
}
void main()
{
int x = 4;
int y = 6;
Exchange(&x, &y);
printf("x = %d\ty = %d\n", x, y);
}
输出的结果为:诶诶诶,刚说好的传递一个值呢,小船怎么说翻就翻……
好吧,这就是函数的另一种传递方法:指针传递。
在main()函数中调用Exchange()时传递的是&x, &y,其实就是:
void Exchange(int *a, int *b)
{
int c = *a;
a=&x;
b=&y; //传递的是x, y的地址
*a = *b;
*b = c;
}
所以现在就可以看出指针a, b就是变量x, y的地址值啦,而接下来的对*a, *b操作就等价于对x, y的操作,就是这样达到了互换的效果。
再把第一个代码改一下:
void Exchange(int &a, int&b) //换成a, b便于理解
{
int z;
z=a;
a=b;
b=z;
printf("x=%d\ty=%d\n", a, b);
}
void main()
{
int x=7,
y=5;
Exchange(x, y);
printf("x=%d\ty=%d\n", x, y);
}
这与第一段代码唯一的区别就在于子函数的定义处:
void Exchange(int&a, int&b)
这里的意思就可以理解为在引用函数Exchange(x, y)里用x, y分别替代了a, b。
而函数里操作的就是x, y变量本身,所以就交换成功啦~。
没错!这就是引用传递
函数的指针传递和引用传递解决了函数只能返回一个值的问题,让子函数更高效。
而同时,在其他语言中也有类似的应用,所以弄清楚这些传递方法是很重要滴~
最后,我的printf才不会出错呐!