引用传递主函数没有为被调函数的引用传递参数复制副本,因此所有操作都是基于原来的参数,因此在被调函数内对参数进行的操作就是对原参数进行的操作,于是参数被改变了,值传递需要复制参数,构造参数的副本,因此比较花时间,引用传递则不会,因此在保证参数不会被改变的情况下,人们喜欢用引用传递提高时间性能。
引用专递就是传递对象本身,值传递是传递对象的复制品
打个比方:比如你有一张相片要修改,把相片编辑工具看作函数,把被处理的相片看作参数,那么直接操作相片原件就相当于引用传递,把相片复制一份然后操作这个复制品就叫值传递。
很明显引用传递会影响当作参数的对象,而值传递不会影响当作参数的对象
printf("a = %d, b = %d
", a,b);
a,b 是变量……指针p1和p2保存的是a和b的地址
函数的参数说起来复杂其实就2种传递,值传递和引用传递,有的人说什么地址传递或指针传递,这其实也是值传递。值传递和引用传递针对的是变量本身,而非通过变量的值找到内存地址做什么改动。
所以说你的函数 void swap(int *pa, int *pb) 指针 p1,p2代入后会生成2份拷贝 pa,pb
pa保存的值是p1的值,也就是a的地址,pb保存的值是p2的值,也就是b的地址。
所以接下来针对pa和pb进行的值交换操作,其结果只是让pa保存了b的地址,pb保存了a的地址,pa和pb在函数结束调用后,生命周期完结。这函数不会对指针p1和p2有任何的影响。
如果你想交换p1和p2指针的值,那就要把函数写成 void swap(int* &pa, int* &pb)
它表示对一个int型指针的引用,这样你的交换会确实的影响到p1和p2的值,让p1保存了b的地址,p2保存了a的地址。就等于执行了p1=&b;p2=&a;
但最后的问题是,你选择了打印输出变量 a 和 b。因为从头至尾都没对指针p1、p2指向的内存地址上保存的值做任何改动和操作,所以a和b的值没变。 想看到变化就要把这句改为
printf("a = %d, b = %d
", *p1, *p2);
是不是很麻烦?所以你完全可以像2楼说的那样直接把函数内容修改一下通过传递进去的地址值直接将该地址上保存的数字进行交换。
声明: 我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理,本站部分文字与图片资源来自于网络,转载是出于传递更多信息之目的,若有来源标注错误或侵犯了您的合法权益,请立即通知我们(管理员邮箱:daokedao3713@qq.com),情况属实,我们会第一时间予以删除,并同时向您表示歉意,谢谢!
本站内容仅供参考,不作为诊断及医疗依据,如有医疗需求,请务必前往正规医院就诊
祝由网所有文章及资料均为作者提供或网友推荐收集整理而来,仅供爱好者学习和研究使用,版权归原作者所有。
如本站内容有侵犯您的合法权益,请和我们取得联系,我们将立即改正或删除。
Copyright © 2022-2023 祝由师网 版权所有
邮箱:daokedao3713@qq.com