彻底搞定C指针》-——第5篇:函数参数的传递(下) 白云小飞 三. 函数参数传递方式之二:地址传递继续——地址传递的问题!看题二的代码:Exchg2(int *px, int *py){ int tmp=*px; *px=*py; *py=tmp; print(“*px=%d,*py=%d\n”,*px,*py);}main(){ int a=4; int b=6; Exchg2(&a,&b); Print(“a=%d,b=%d\n”, a, b);}它的输出结果是: *px=6,*py=4 a=6,b=4 看函数的接口部分:Exchg2(int *px,int *py),请注意:参数px,py都是指针。 再看调用处:Exchg2(&a, &b); 它将a的地址(&a)代入到px,b的地址(&b)代入到py。同上面的值传递一样,函数调用时作了两个隐含的操作:将&a,&b的值赋值给了px,py。px=&a;py=&b; 呵呵!我们发现,其实它与值传递并没有什么不同,只不过这里是将a,b的地址值传递给了px,py,而不是传递的a,b的内容,而(请好好地在比较比较啦) 整个Exchg2函数调用是如下执行的: px=&a; // py=&b; //请注意这两行,它是调用Exchg2的隐含动作。 int tmp=*px; *px=*py; *py=tmp; print(“*px=%d,*py=%d\n”,*px,*py); 这样,有了头两行的隐含赋值操作。我们现在已经可以看出,指针px,py的值已经分别是a,b变量的地址值了。接下来,对*px,*py的操作当然也就是对a,b变量本身的操作了。所以函数里头的交换就是对a,b值的交换了,这就是所谓的地址传递(传递a,b的地址给了px,py),你现在明白了吗?四. 函数参数传递方式之三:引用传递 看题三的代码:Exchg3(int &x, int &y) //注意定义处的形式参数的格式与值传递不同{ int tmp=x; x=y; y=tmp; print(“x=%d,y=%d\n”,x,y);}main(){ int a=4; int b=6; Exchg3(a,b); //注意:这里调用方式与值传递一样 Print(“a=%d,b=%d\n”, a, b);}输出结果:x=6, y=4a=6, b=4 //这个输出结果与值传递不同。 看到没有,与值传递相比,代码格式上只有一处是不同的,即在定义处:Exchg3(int &x, int &y)。 但是我们发现a与b的值发生了对调。这说明了Exchg3(a,b)里头修改的是a,b变量,而不只是修改x,y了。 我们先看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的值了。 最后对值传递与引用传递作一个比较:1. 在函数定义格式上有不同:值传递在定义处是:Exchg1(int x, int y);引用传递在这义处是:Exchg1(int &x, int &y);2. 调用时有相同的格式:值传递:Exchg1(a,b);引用传递:Exchg3(a,b);3. 功能上是不同的:值传递的函数里操作的不是a,b变量本身,只是将a,b值赋给了x,y函数里操作的只是x,y变量而不是a,b,显示a,b的值不会被Exchg1函数所修改。引用传递Exchg3(a,b)函数里是用a,b分别代替了x,y。函数里操作的就是a,b变量的本身,因此a,b的值可在函数里被修改的。

评论