本文主要向大家介绍了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+频道!

交换变量地址 c语言,C/C++知识点之C语言内存地址交换相关推荐

  1. 【CE入门教程】使用Cheat Engine(CE)查找“扫雷”中“雷数”、“旗子”、“笑脸”和“计时器”的内存地址以及“初级”、“中级”和“高级”的棋盘内存地址范围

    目录 1.查找"雷数"和旗子的内存地址 2.查找"笑脸"的内存地址 3.查找"计时器"的内存地址 4.查找"初级".&q ...

  2. 职坐标c语言,C/C++知识点之C语言编程练习题及答案分享

    本文主要向大家介绍了C/C++知识点之C语言编程练习题及答案分享,通过具体的内容向大家展示,希望对大家学习C/C++知识点有所帮助. 1. 题目:写一个程序,判断两个浮点数是否足够精确. /*  Fi ...

  3. 职坐标c语言,C/C++知识点之C语言练习:第二大整数

    本文主要向大家介绍了C/C++知识点之C语言练习:第二大整数,通过具体的内容向大家展示,希望对大家学习C/C++知识点有所帮助.问题描述 编写一个程序,读入一组整数(不超过20个),当用户输入0时,表 ...

  4. 职坐标c语言,C/C++知识点之c语言中的#line

    本文主要向大家介绍了C/C++知识点之c语言中的#line,通过具体的内容向大家展示,希望对大家学习C/C++知识点有所帮助. #line指令用于改变 __LINE__和__FILE__的内容. __ ...

  5. java查看对象地址_如何获取到JAVA对象所在的内存地址

    展开全部 1.首先打开java构造方法代码. 2.接下来就可以获得网卡物理地址方法代码. 3.然32313133353236313431303231363533e4b893e5b19e31333431 ...

  6. 【C语言】如何不用中间变量交换变量的值

    [C语言]如何不用中间变量交换变量的值 思路分析 一般我们进行C语言中的变量交换时都是使用一个中间变量来进行求解,其实不适用中间变量也一样可以只需要使用下面的公司即可 m = m + n -n n = ...

  7. C语言对内存地址的封装

    变量名.数据类型.函数名的意义 对内存地址的封装(变量名.数据类型.函数名的意义) 用指针来间接访问内存 用数组来管理内存 对内存地址的封装(变量名.数据类型.函数名的意义) 在C中数据类型的本质含义 ...

  8. c语言中通过指针将数值赋值到制定内存地址

    1.一种直观的方法 假设现在需要往内存0x12ff7c地址上存入一个整型数0x100.我们怎么才能做到呢? 我们知道可以通过一个指针向其指向的内存地址写入数据,那么这里的内存地址0x12ff7c其本质 ...

  9. 公务员c语言试题,公务员-计算机类C语言复习参考答案.doc

    第一章C语言概述 一.知识点 1. c语言的特点:①语言简洁.紧凑,使用方便.灵活:②运算符丰富: ③数据结构丰富: ④具有结构化控制语句: ⑤ 语法限制不太严格,程序设计自由度大: ⑥ 可以进行位操 ...

最新文章

  1. php调用python脚本_Window环境下,PHP调用Python脚本
  2. php tp5 redis的使用(亲测)
  3. 为什么所有的React应用开头都有一行meta charset=utf-8语句?
  4. Reflection in .net
  5. spark抽取mysql数据到hive_使用spark将内存中的数据写入到hive表中
  6. javascript中Array的操作
  7. linux常用命令(ubuntu)
  8. base32解码工具_[随波逐流]CTF编码工具 V1.0
  9. CheckedListBoxControl 实现复选框的单选与多选功能
  10. ORACLE 36进制和10进制,互相转换函数
  11. 周志华机器学习西瓜书速记第二章绪论模型评估与选择(一)
  12. mysql修改指定记录_sql操作之修改记录值
  13. tracert原理和使用方法
  14. 基于阿里云产品和开源Hudi结合
  15. iPad除了用来吃喝玩乐,还能能写代码了?
  16. java 评论功能_博客项目实现文章评论功能(重点是评论回复)
  17. 民生问题:房价,房贷,首付之间的暖昧关系(借首页一放,点醒一下各位兄弟)
  18. 怎样写标题才能获得流量,写标题的技巧
  19. 【狂神说】 mysql 自学总结 7~9章
  20. 在unity中使用Newtonsoft.Json

热门文章

  1. css什么是自适应布局,CSS中常见的自适应布局是什么
  2. 如何解决Windows 7的多重网络问题
  3. Andriod-手电筒应用小思路(二)
  4. SpringBoot 实现并发登录人数控制
  5. 记一道简单的java面试题
  6. Dell戴尔笔记本电脑外星人系列G3 15 3590原装出厂Windows10系统恢复原厂预装OEM系统
  7. 漫谈android系统(9)-androidO的Android Treble 计划与大的变动
  8. 苹果支付流程以及服务端php验证
  9. PC-DMIS 2019 星型针的校验和使用
  10. 2022 年会是 Linux 桌面元年吗?本文与你娓娓道来