当前课程知识点:程序设计基础 > 第二章 变量与代数思维 > 2.6 关于变量的讨论 > 2.6.3 变量内存单元地址
第三个讨论的是变量存在什么地方呢
答案其实也蛮显然
它存在内存的单元里头
但问题是 单元又在哪里呢
当然我们提这个问题不是让你把计算机给拆了
你拆了你也不知道在哪里
它在内存的芯片
那只是一个很小的芯片
数据到底存在里面的什么地方
其实仍然也看不见
但是我们下面要讨论的是
我们能不能通过程序
稍稍做一点深入的了解呢
这是一个程序的代码
在这个代码里头我们定义了几种不同的变量
有整数 有浮点数 有double数
还有这个字符类型
四个不同的变量 它们有各自的初始值
这个很自然 很简单
我们看下面的cout语句
这个cout每一个都是有一个提示信息
然后后面是一个新东西
在变量的名字前面 有一个&符号
被cout出来了
比如第一行是&N
第二行是&F 第三行&D等等等等
这个&符号表示的是
去获得变量的存储的内存空间的地址
所以通过这样的cout我们就可以观察
在计算机程序里头所定义的这几个变量
它到底放在计算机内存里头的哪个地方的
这是计算机运行的结果
我们可以看到 在这个结果里头
有一些奇怪的现象
前面三行输出整数 浮点数 double数
它的地址看上去都很类似
都是0X22FF44 40 38
我们把这个数称为16进制的数
看上去是这样形式的一个输出
但是第四行 大家看
输出来的是一个* 一个红心的这个符号
那么这是什么呢
按道理这一行应该输出字符C的存放地址
但是它没有像前面的整数 浮点数
和双精度数那样的输出
一个长得像地址的那样的内容
输出的是两个符号
如果我们把这个程序稍稍做了改动
把程序里头对于double D的定义
把它从1.23改成0.0的话
我们再次运行这个程序
你会发现 结果又不一样
这个时候前三行还是那几个值
但是第四行 也就是刚才说到的C的地址
现在变成了一个*
那个红心那个字符没有了
那么这个里头的差别为什么会发生呢
其实 这就涉及到用cout来
输出变量地址的时候的一个隐含的规则
如果这个地址不是字符变量的地址的话
那么它就会输出这个变量在内存单元的地址
也就像刚才说到的N F D
这三种类型在取&之后输出的是
它们内存单元的地址
而如果是字符变量的话 你去取它的地址
然后希望用cout来输出
它就会按照另外一种特殊的规则来处理
什么规则呢
就是输出这个内存单元的值
以及它的紧挨着的下一个值
以及再挨着的再下一个值
一直到内存单元的值碰到0才结束
那这就意味着
如果存放字符变量的那个值
它后面的那个值 就下一个内存的那个值
不是0的话 这个紧挨着的这一个
也会把它的内容输出出来
直到某一个单元它的值是0
然后才停止
这就是为什么刚才我们在第一个代码里头
当这个代码的double
这个精度的变量D等于1.23的时候
在输出C这个字符的地址的时候
输出的字符内容有两个
而当我们把double D的这个变量的值
改为0的时候
它输出的结果是一个
因为double D等于0
恰好又紧挨着字符单元
所以它只把*输出出来就停止了
而前面D等于1.23的那个版本
在这个*后面的单元 它不是0
它是个别的东西
因为那个单元是用来表示double D的
所以它就多输出了一个红心这样一个符号
所以刚才看上去很奇怪的这两个不同的输出
原因就在于对于字符变量的单元的地址
如果用System.out输出的话
它的规则上面有差别所导致的
那么我们可以画一个非常直观的形象的一个图
来表示刚才几个变量存储的这个位置
大家看到在这个图里头
从下往上 依次存放的是
C的值 D的值 F的值 N的值
然后每一个条块代表的是一个字节
所以整数四个字节 四块
浮点数四个字节 四块
Double八块 紧接着C一块
这样的话你可以看到
在我们输出C的单元的内容的时候
由于我们输出的单元的地址&C
cout出来的时候 按照我们那个规则
它会一直从底下往上去输出单元的内容
直到碰到一个0
一看这个图 我想刚才的解释就更加清楚
-1.1 基础知识
-1.2 买菜问题
-1.3 数学运算
-1.4 补充说明
-1.5 总结
--1.5 总结
-程设论道
--程设论道
-师生问答
-第一章 编程初步--语法自测
-2.1 关于超级计算器的几点思考
-2.2 电子秤模拟 — 背景介绍及需求分析
-2.3 电子秤模拟 — 代码实现
-2.4 变量定义与变量类型
-2.5 猜数游戏与数据表示
-2.6 关于变量的讨论
--公告
-2.7 变量体现的计算思维
-程设论道
--程设论道
-师生问答
--师生问答
-第二章 变量与代数思维--语法自测
-3.1 谁做的好事——语义表示
-3.2 谁做的好事——真假检查
-3.3 谁做的好事——循环枚举
-3.4 谁是嫌疑犯——多重循环枚举
-3.5 谁是嫌疑犯——破案线索表示
-3.6 谁是嫌疑犯——用二进制枚举
-程设论道
--程设论道一
--程设论道二
--程设论道三
-师生问答
-第三章 逻辑推理与枚举解题--语法自测
-4.1 插花游戏
-4.2 筛法
-4.3 线性查找
-4.4 折半查找
--4.4.1 提问
-4.5 排序问题
-4.6 总结
--4.6.1 总结
-程设论道
--程设论道二:筛法
-师生问答
-第四章 筛法与查找--语法自测
-5.1 阶乘
-5.2 排序
-5.3 矩阵填充
-5.4 分书与八皇后
-5.5 青蛙过河
-程设论道
--程设论道一
--程设论道二
-师生问答
--师生问答一
--师生问答二
-第五章 分治思想与递归--语法自测
-6.1 兔子数列问题
-6.2 分鱼问题
-6.3 橱窗的插花问题
-6.4 最长公共子序列问题
-程设论道
--程设论道一
--程设论道二
-师生问答
--师生问答
-第六章 递推与动态规划--语法自测
-7.1 统计记录总数
-7.2 统计活跃用户数
-7.3 统计在线时长
--7.3.2 结构
-7.4 总结
--7.4.1 总结
-程设论道
--程设论道
-师生问答
--师生问答
-第七章 文本数据处理--语法自测
-8.1 将数据组织成链表
-8.2 提高链表访问效率 —— 哈希链表
-8.3 以二进制文件存储链表
-程设论道
--程设论道一
--程设论道二
-师生问答
--师生问答
-第八章 非文本数据处理--语法自测
-9.1 自动售卖程序
-9.2 配制水果信息
-9.3 指定界面语言
-程设论道
--程设论道
-师生问答
--师生问答
-第九章 可配置的程序设计--语法自测