swap传入指针也会交换失败
发布日期:2021-06-29 11:10:10
浏览次数:3
分类:技术文章
本文共 2295 字,大约阅读时间需要 7 分钟。
今天上课就真的长知识了,一直以为自己学得还可以,知识面还算有点广,然而这次就打脸了啊;闲话不多说,直接进入主题;
以前看视频学习的时候就记得过这样一句话,
想要利用函数来交换两个数的值,只能传递指针。 然而我误以为只要传递指针就能交换两个数的值。然而错了。事实证明吧;先看一下传递数值的情况吧;
#includevoid swap(int x, int y){ int t; t = x; x = y; y = t;}int main(){ int a, b; scanf("%d %d",&a, &b); swap(a, b); printf("%d %d",a, b); return 0 ;}
这个都知道的,肯定没有交换成功啊。说一下原因吧;
先说一下,每个变量都对应这一个地址,函数中的变量也是这样的。 再回归正题吧。传递a,b,变成了x,y。然后x,y进行了交换,当函数结束的时候,xy变量的内存也会释放掉,所以并没有将交换的值赋给a,b了。所以这个函数并没有达到交换结果。 我觉得用一个程序可以更好的解释;#includevoid swap(int x, int y){ int t; t = x; x = y; y = t; printf("%d %d\n",x, y); printf("%d %d\n\n",&x,&y); //x,y的地址}int main(){ int a, b; scanf("%d %d",&a, &b); swap(a, b); printf("%d %d\n",&a,&b); //a,b的地址 printf("%d %d\n",a, b); return 0 ;}
应该懂了吧;
再看下一个swap;
传递的是指针变量;#includevoid swap(int * x, int * y){ int t; t = *x; *x = *y; *y = t;}int main(){ int a, b , *pa, *pb; scanf("%d %d",&a, &b); pa = &a; pb = &b; swap(pa, pb); printf("%d %d\n",a, b); return 0 ;}
这个是交换成功的。还是解释一下吧;
这个例子就是我最前面说的那句话的事实吧;想要利用函数来交换两个数的值,只能传递指针; 比较一下这个例子与上面那个交换失败的不同吧; 他传递的是指针变量,然而为什么就成功了呢? 因为传递的是指针变量,相当于传递的是地址,则再根据swap函数,可以理解位swap函数的交换就是交换传递过来地址中的变量。当函数结束,就意味值交换结束,然而这变量的地址并没有释放,因为这是属于主函数的,只是经过swap函数来处理一下这一地址中的变量。 同样的代码来证明一下吧;#includevoid swap(int * x, int * y){ int t; t = *x; *x = *y; *y = t; printf("%d %d\n",*x, *y); printf("%d %d\n\n",x,y); }int main(){ int a, b , *pa, *pb; scanf("%d %d",&a, &b); pa = &a; pb = &b; swap(pa, pb); printf("%d %d\n",&a,&b); printf("%d %d\n",a, b); return 0 ;}
进入正题了。同样传递的是指针然而交换会失败呢?当时真的有点不能理解呢?
其实后面再一想,确实啊,怎么可能会交换ab的值呢; 先看一下它是怎么交换的吧?#includevoid swap(int * x, int * y){ int * t; t = x; x = y; y = t;}int main(){ int a, b , *pa, *pb; scanf("%d %d",&a, &b); pa = &a; pb = &b; swap(pa, pb); printf("%d %d\n",a, b); return 0 ;}
这个代码交换的是地址,根本就没有交换ab的值,发现了吧?
代码证明一下吧;#includevoid swap(int * x, int * y){ int * t; t = x; x = y; y = t; printf("%d %d\n",*x, *y); printf("%d %d\n\n",x,y); }int main(){ int a, b , *pa, *pb; scanf("%d %d",&a, &b); pa = &a; pb = &b; swap(pa, pb); printf("%d %d\n",&a,&b); printf("%d %d\n",a, b); return 0 ;}
转载地址:https://blog.csdn.net/zw1996/article/details/51252957 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
关注你微信了!
[***.104.42.241]2024年04月12日 18时06分08秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
树莓派WIFI设置
2019-04-29
用vcgencmd获取树莓派硬件状态数据
2019-04-29
IIS 多域名多张证书配置
2019-04-29
树莓派LINUX 截屏
2019-04-29
树莓派Raspberry Pi的嵌入式QT平台
2019-04-29
apache https
2019-04-29
Debian Jessie安装支持HTML5音视频的Chromium浏览器听百度音乐
2019-04-29
nanopi2 启动信息
2019-04-29
POS打印机驱动大全
2019-04-29
phpstudy https
2019-04-29
centos apache 最新版HTTPS配置
2019-04-29
树莓派添加中文语音合成功能
2019-04-29
kangle https设置
2019-04-29
Linux下EasyPanel版本安装及升级
2019-04-29
raspberry pi(树莓派) + easycap d60 视频采集
2019-04-29
WebRTC
2019-04-29
rfc5766-turn-server NAT
2019-04-29
webrtc详细教程
2019-04-29
Android IOS WebRTC 音视频开发总结
2019-04-29