【我的printf是不是出bug啦!!】之懵逼函数传递

最近看到这样一段关于函数传递的代码:

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)

而这段代码的输出结果为,成功交换了x, y的值生气

这里的意思就可以理解为在引用函数Exchange(x, y)里用x, y分别替代了a, b。

而函数里操作的就是x, y变量本身,所以就交换成功啦~吐舌头

没错!这就是引用传递得意


函数的指针传递和引用传递解决了函数只能返回一个值的问题,让子函数更高效。

而同时,在其他语言中也有类似的应用,所以弄清楚这些传递方法是很重要滴~可怜


最后,我的printf才不会出错呐!大笑

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值