文章目录
有棱有角的内存
0、热身问题
- 有十个地址信号引脚的内存IC(集成电路)可以指定的地址范围是多少?
2^10 = 1024个地址,即十六进制表示0x 00 00 00 ~ 0x 0F FF FF。 - 高级编程语言中的数据类型表示的是什么?
占据内存区域的大小和存储在该内存区域的数据类型。 - 在32位内存地址的环境中,指针变量的长度是多少位?
32位。 - 与物理内存有着相同构造的数组的数据类型长度是多少?
1字节。因为物理内存是以字节为单位进行数据存储的。 - 用LIFO方式进行数据读写的数据结构称为什么?
LIFO(Last In First Out,先进后出),栈。 - 根据数据的大小链表分叉成两个方向的数据结构称为什么?
二叉查找树(Binary Search Tree)。
由于数据对象是存储在内存和磁盘上的,因此程序必须能自由地使用内存和磁盘。这篇文章,我们先来了解一下“内存”,后面我们再了解“磁盘”。
1、内存的物理机制很简单
内存:一种名为内存IC的电子元件。
内存中有大量输入和输出的引脚(IC的引脚),包括电源、地址信号、数据信号、控制信号等,通过为其指定地址(address)来进行数据的读写。
举个小例子,我们的计算机一般都是512M的内存,这就相当于524288个1KB的内存IC。
512M = 512 MB = 512 * 1024 * 1024 * 1 B
1KB = 1024 B = 1024 * 1 B
512MB / 1KB = 512 * 1024 = 524288
但是一般我们的计算机都会有更多的地址引脚和数据引脚,这样一块内存IC的容量就会达到数十兆字节。
接下来,我们来看看数据的读写。
2、内存的逻辑模型是楼房
以我们上面讲到的内存IC为例子,类比“楼房”,一层可以存储1个字节的数据,而楼层号则表示地址编号。
数据类型:存储的是何种类型的数据。
变量:可以简单理解为某块“内存地址”的别名。
通过使用变量,即便不指定内存地址,也可以在程序中对内存进行读写。
以C语言为例子。
char a = 123; //1字节
short b = 123; //2字节
long c = 123; //4字节
低字节序:将多字节数据的低位字节存储在内存低位的方式。奔腾等英特尔处理器用的就是低字节序。
高字节序:将多字节数据的高位字节存储在内存低位的方式。
我们以“低字节序”为例子,虽然变量的值都为123,但是其占用的内存空间可不同。
3、简单的指针
大家应该还记得C语言中的指针吧,我个人是对它又爱又恨啊。
指针:存储的数据的内存的地址。
指针变量:存放指针的变量。
char* d;
short* e;
long* f;
对于“short* e”:
- *表示该变量是该变量是指针变量;
- short指数据类型,表示一次性可以读取的字节数。
4、数组是高效使用内存的基础
数组:多个同样数据类型的数据在内存中连续排列的形式。
索引:数组元素的编号。
索引和内存地址的交换工作是由编译器自动实现的。指定索引之后,CPU通过基址寄存器和变址寄存器来指定内存地址,进而对其进行读写操作。
根据指针和数组的关系:
- 数组名(指针)对应基址寄存器。
- 索引(指针增量)对应变址寄存器。
char g[100]; //char类型的数组以1字节为单位对内存进行读写。
short h[100]; //short类型的数组以2字节为单位对内存进行读写。
long i[100]; //long类型的数组以4字节为单位对内存进行读写。
5、栈、队列以及环形缓冲区
栈:LIFO,后进先出。
队列:FIFO,先进先出。
应用:
- 栈:当前暂时舍弃的数据,随后再还原。
- 队列:先到先处理,如通讯中发的数据或同时运行的程序发送过来的数据。
这一块的知识在《数据结构与算法》这门课中会重点介绍。
6、链表使元素的追加和删除更容易
这一块的知识在《数据结构与算法》这门课中会重点介绍。
7、二叉查找树使数据检索更有效
这一块的知识在《数据结构与算法》这门课中会重点介绍。
注:如哟错误,敬请指正!