当前课程知识点:程序设计基础 >  第二章 变量与代数思维 >  2.6 关于变量的讨论 >  2.6.3 变量内存单元地址

返回《程序设计基础》慕课在线视频课程列表

2.6.3 变量内存单元地址在线视频

2.6.3 变量内存单元地址

下一节:2.6.4 存“变量地址”的变量——指针

返回《程序设计基础》慕课在线视频列表

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.1.1 什么是程序?什么是语言?

--1.1.2 什么是程序设计?

--1.1.3 计算机发展史

-1.2 买菜问题

--1.2.1 问题描述

--1.2.2 程序的基本结构

-1.3 数学运算

--1.3.1 数学运算符

--1.3.2 数学函数

-1.4 补充说明

--1.4.1 编程环境的下载与安装

--1.4.2 程序基本结构中的含义

--1.4.3 格式与风格

-1.5 总结

--1.5 总结

-程设论道

--程设论道

-师生问答

--师生问答一:怎样学好程序设计

--师生问答二:语言选择

--师生问答三:关于函数

-第一章 编程初步--语法自测

第二章 变量与代数思维

-2.1 关于超级计算器的几点思考

--2.1.1 关于超级计算器的几点思考

-2.2 电子秤模拟 — 背景介绍及需求分析

--2.2.1 电子秤模拟 — 背景介绍及需求分析

-2.3 电子秤模拟 — 代码实现

--2.3.1 电子秤模拟 — 代码实现

-2.4 变量定义与变量类型

--2.4.1 变量定义与变量类型

-2.5 猜数游戏与数据表示

--2.5.1 猜数游戏与数据表示

-2.6 关于变量的讨论

--2.6.1 变量的初始值

--2.6.2 变量类型

--2.6.3 变量内存单元地址

--2.6.4 存“变量地址”的变量——指针

--2.6.5 指针的 读/写 操作

--2.6.6 指针的 加/减 操作

--公告

-2.7 变量体现的计算思维

--2.7.1 变量体现的计算思维

-程设论道

--程设论道

-师生问答

--师生问答

-第二章 变量与代数思维--语法自测

第三章 逻辑推理与枚举解题

-3.1 谁做的好事——语义表示

--3.1.1 谁做的好事——语义表示

-3.2 谁做的好事——真假检查

--3.2.1 谁做的好事——真假检查

-3.3 谁做的好事——循环枚举

--3.3.1 谁做的好事——循环枚举

-3.4 谁是嫌疑犯——多重循环枚举

--3.4.1 谁是嫌疑犯——多重循环枚举

-3.5 谁是嫌疑犯——破案线索表示

--3.5.1 谁是嫌疑犯——破案线索表示

-3.6 谁是嫌疑犯——用二进制枚举

--3.6.1 谁是嫌疑犯——用二进制枚举

-程设论道

--程设论道一

--程设论道二

--程设论道三

-师生问答

--师生问答一:字符与ASCII码表

--师生问答二:其他循环语句、运算符优先级与变量作用域

-第三章 逻辑推理与枚举解题--语法自测

第四章 筛法与查找

-4.1 插花游戏

--4.1.1 问题提出(求素数)

--4.1.2 函数初探

--4.1.3 运行演示

-4.2 筛法

--4.2.1 筛法思路

--4.2.2 数组的定义

--4.2.3 代码翻译

--4.2.4 运行演示

--4.2.5 小朋友数人数

--4.2.6 运行演示

--4.2.7 韩信点兵

-4.3 线性查找

--4.3.1 扑克查找问题

--4.3.2 扑克查找问题代码翻译

--4.3.3 最小值问题

--4.3.4 最小值问题代码翻译

-4.4 折半查找

--4.4.1 提问

--4.4.2 折半查找思路

--4.4.3 折半查找代码翻译

--4.4.4 折半查找运行演示

-4.5 排序问题

--4.5.1 插入排序

--4.5.2 选择排序

--4.5.3 函数写法

--4.5.4 运行演示

-4.6 总结

--4.6.1 总结

-程设论道

--程设论道一:数组与编码思维

--程设论道二:筛法

-师生问答

--师生问答一:函数与面向过程编程

--师生问答二:数组的下标越界

-第四章 筛法与查找--语法自测

第五章 分治思想与递归

-5.1 阶乘

--5.1.1 阶乘问题

--5.1.2 递归解法

--5.1.3 递归小结

-5.2 排序

--5.2.1 归并排序——总体思路

--5.2.2 归并排序——思路分解

--5.2.3 归并排序——代码解说

--5.2.4 快速排序——总体思路

--5.2.5 快速排序——代码解说

--5.2.6 排序总结

-5.3 矩阵填充

--5.3.1 矩阵填充问题

--5.3.2 代码解说

-5.4 分书与八皇后

--5.4.1 问题描述

--5.4.2 问题分析——共性

--5.4.3 问题分析——区别

--5.4.4 解题准备——二维数组

--5.4.5 解题准备——递归设计

--5.4.6 代码解说——分书问题

--5.4.7 代码解说——八皇后问题

-5.5 青蛙过河

--5.5.1 问题描述

--5.5.2 问题分析——简单情况

--5.5.3 问题分析——复杂情况

--5.5.4 问题分析——一般情况

-程设论道

--程设论道一

--程设论道二

-师生问答

--师生问答一

--师生问答二

-第五章 分治思想与递归--语法自测

第六章 递推与动态规划

-6.1 兔子数列问题

--6.1.1 问题描述

--6.1.2 按大小兔子分别递推

--6.1.3 按总数递推

--6.1.4 不用数组递推

-6.2 分鱼问题

--6.2.1 问题描述

--6.2.2 从A到E递推

--6.2.3 从E到A递推

-6.3 橱窗的插花问题

--6.3.1 问题描述

--6.3.2 题意理解与分析

--6.3.3 用枚举思想解题

--6.3.4 采用递推的优化算法

--6.3.5.1 采用动态规划算法—优化分析

--6.3.5.2 采用动态规划算法—递推代码

--6.3.5.3 采用动态规划算法—计算过程

--6.3.5.4 采用动态规划算法—输出方案

--6.3.6 动态规划总结

-6.4 最长公共子序列问题

--6.4.1 问题描述与理解

--6.4.2 问题分析

--6.4.3.1 动态规划解题(1)

--6.4.3.2 动态规划解题(2)

--6.4.3.3 动态规划代码

-程设论道

--程设论道一

--程设论道二

-师生问答

--师生问答

-第六章 递推与动态规划--语法自测

第七章 文本数据处理

-7.1 统计记录总数

--7.1.1 问题分析

--7.1.2 读文件操作

-7.2 统计活跃用户数

--7.2.1 问题分析

--7.2.2 字符串

--7.2.3 程序翻译与演示

-7.3 统计在线时长

--7.3.1 问题分析

--7.3.2 结构

--7.3.3 程序翻译与演示

--7.3.4 写文件操作

-7.4 总结

--7.4.1 总结

-程设论道

--程设论道

-师生问答

--师生问答

-第七章 文本数据处理--语法自测

第八章 非文本数据处理

-8.1 将数据组织成链表

--8.1.1 链表的基本概念

--8.1.2 代码讲解

--8.1.3 链表遍历与释放

-8.2 提高链表访问效率 —— 哈希链表

--8.2.1 简单的哈希算法

--8.2.2 算法实现

-8.3 以二进制文件存储链表

--8.3.1 二进制文件的操作方法

--8.3.2 代码讲解

-程设论道

--程设论道一

--程设论道二

-师生问答

--师生问答

-第八章 非文本数据处理--语法自测

第九章 可配置的程序设计

-9.1 自动售卖程序

--9.1.1 提出问题与初步设计

--9.1.2 细化实现订单处理

--9.1.3 使程序更健壮

-9.2 配制水果信息

--9.2.1 提出问题与设计文件格式

--9.2.2 实现订单处理功能

-9.3 指定界面语言

--9.3.1 提出问题与命令行参数

--9.3.2 实现程序功能

-程设论道

--程设论道

-师生问答

--师生问答

-第九章 可配置的程序设计--语法自测

2.6.3 变量内存单元地址笔记与讨论

也许你还感兴趣的课程:

© 柠檬大学-慕课导航 课程版权归原始院校所有,
本网站仅通过互联网进行慕课课程索引,不提供在线课程学习和视频,请同学们点击报名到课程提供网站进行学习。