C/C++知识点之C语言内存地址交换
小标 2018-11-01 来源 : 阅读 2055 评论 0

摘要:本文主要向大家介绍了C/C++知识点之C语言内存地址交换,通过具体的内容向大家展示,希望对大家学习C/C++知识点有所帮助。

本文主要向大家介绍了C/C++知识点之C语言内存地址交换,通过具体的内容向大家展示,希望对大家学习C/C++知识点有所帮助。

C语言课很无聊,因为之前学过C#所以就感觉特别的无聊.

但是,只能说我看过,不能代表我懂.
特别是这个地址交换.但是我是想做一个排序尺算法,里面有一个Swap函数,作用是比较两个数的大小,保证形参a永远大于形参b,里面正好用了一个地址交换.
那时候做错了,没有任何实际效果.为了完成那个作业,我就迅速重构了一遍,然后把地址交换变成了值交换.
今天上课的时候正好碰到那时候仓促改代码却没有好好思考的问题.也就是地址交换无效的问题.
让我回顾一下当时的遭遇:

 1 void swap(int *a, int* b)
 2 {
 3     //swap函数作为一个数据交换函数,完成a,b两个数的大小比较
 4     //如果b>a则交换地址,使之左边恒大于右边
 5     if (*a > *b)
 6     {
 7         int *c = a; 
 8         a = b;
 9         b = c;
10     }
11     //这里完成地址交换
12 }

 
  但是结果却是没有改变,比如传入的变量a=12,b=13.结束之后a仍然等于12,b仍然等于13.
当时因为时间问题,并没有深究,但是现在老师给我们同样的问题,这下就暴露出我什么都不懂了.
下面是老师课堂上的代码.

1 void swap(int *a, int* b)
2 {
3     int* temp=a;
4         a=b;
5         b=temp;
6 }    

 
  同样的,地址交换成功,跳出swap函数体的时候一切都变回了原样.
这时候不得不自己去寻找问题(其实老师在课上已经讲了,但是我不打算听,自己身上满满的捣鼓劲,想要自己实践)
按照代码的效果反馈,我选择添加断点;

上面的图已经告诉我们现在变量a的值为0x004ffa5c,变量b的值为0x004ffa50,这是没有交换之前的.

这里的地址已经改变了.但是我们看一下整体结果

看到这里,我有点绝望了,地址量居然没有改变.
那原因是什么呢?
请看上面我特意输出的3,4行.
这里已经很清楚的显示了一切.我们先来理解一下:

也就是说我们操作的根本不是变量实体,这里是详细的模型

图例已经告诉大家,指针保存的是一个地址(这里的地址可以是类的地址,函数的地址,指针的地址...),我们通过*操作的值,实际上是找到指针的值对应的物理地址然后再操作的。
这里其实有两个结论:
  1、指针只能操作一个变量实体的值,而不能操作变量实体的地址!
  2、形参的值是不能传递给实参的(验证而已)
今天的随笔可能比较让人难以琢磨,因为我没有解释我这样写代码的理论依据,因为种种原因,思路不是很清晰,所以就不打算写太详细
,毕竟老师在课堂上已经告诉我们了。这里实际上就是对自己推论的一个验证。这里的论证思路就留给读者推敲吧

本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注职坐标编程语言C/C+频道!

本文由 @小标 发布于职坐标。未经许可,禁止转载。
喜欢 | 2 不喜欢 | 0
看完这篇文章有何感觉?已经有2人表态,100%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式AI+学习就业服务平台 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved