第4章 熟练使用有菱有角的内存
热身问题
1:有十个地址信号引脚的内存IC可以指定的地址范围是多少?
能够表示2的十次冪个数据,十进制表示的话就是0-1023.
2:高级编程语言中的数据类型表示的是什么?
不仅仅表示存储在内存数据的数据的类型,还表示占据内存区域的大小。
3:在32位内存地址的环境中,指针变量的长度是多少位?
32位,指针指的是用来存储内存地址的变量,因此在32位内存地址的环境中必有32位。
4:用LIFO方式进行数据读写的数据结构称为什么?
栈,LIFO=Last In First Out.
4.1 内存的物理机制很简单
内存实际上是一种名为内存IC的电子元件。内存IC主要分为:ROM(Read Only Memory)只能用来读取的内存和RAM(Random Access Memory(random |ˈrændəm| adj 随机的;access |ˈækses| noun 入口.))可被读取和写入的内存(有需要经常刷新(refresh)以保存数据的DRAM(Dynamic RAM),以及不需要刷新电路既能保存数据的SRAM(Static RAM))。
内存IC中有电源引脚、地址信号引脚、数据信号引脚、控制信号引脚等用于输入输出的大量引脚(IC的引脚)、通过为其指定地址(address),来进行数据的读写。
以具有8个数据引脚和10个地址引脚的内存IC为例:八个数据引脚一次个输入输出8位(=1字节)的数据。地址信号引脚可以表示2的10次冪个地址。而地址是用来表示数据存储的场所,因此可知这个内存IC中可以存储1024个1字节的数据。所以该内存IC的容量就是1KB。虽然前面所提到的假想内存IC中仅有10个地址信号引脚,但通常使用的是32位的内存地址。
如我们想向内存内写入数据,则有:接通电源—>用地址引脚确定存储场所—>由数据引脚输入数据—>用WR或RD引脚决定写入或者读出。像WR和RD这样可以控制IC运行的信号称为控制信号,其中WR和RD同时为0时,写入和读出的操作都无法运行。
4.3 简单的指针
指针是一种变量,他所表示的不是数据的值,而是存储着数据的内存的地址。通过使用指针,就可以对任意指定地址的数据进行读写。
4.4 数组是高效实用内存的基础
数组是指多个同样数据类型的数据在内存中连续排列的形式。作为数据元素的各个数据会通过连续的编号被区分开来,这个编号被称为索引(index)。
指定索引后,就可以对该索引所对应地址的内存进行读写操作。而索引和内存地址的变换工作由编译器自动实现(CPU是通过基址寄存器和变址寄存器来指定内存地址的)。
4.5 栈、队列以及环形缓冲区
栈和队列,都可以不通过指定地址和索引来对数组的元素进行读写。栈用的是LIFO(Last Input First Out,后入先出)方式,而队列用的则是FIFO(First Input First Out,先入后出)方式。