一.熟练使用有棱有角的内存
1.内存的物理机制
内存实际上是一种名为内存IC的电子元件。 虽然内存IC包括DRAM、SRAM、ROM 等多种形式, 但从外部来看,其基本机制都 ①是一样的。内存IC中有电源、地址信号、 数据信号、控制信号等用于输人输出的大量引脚(IC的引脚), 通过为其指定地址(address ),来进行数据的读写。
2.简单的指针
指针也是一种变量, 它所表示的不是数据的值,而是存储着数据的内存的地址。通过使用指针, 就可以对任意指定地址的数据进行读写。虽然前面所提 到的假想内存IC中仅有10位地址信号, 但大家在Windows计算机上 使用的程序通常都是32位(4字节 )的内存地址。这种情况下,指针变量的长度也是32位。
3.数组是高效使用内存的基础
数组是指多 个同样数据类型的数据在内存中连续排列的形式。作为数组元素的各个数据会通过连续的编号被区分开来,这个编号称为索引(index·)。 指定索引后,就可 以对该索引所对应地址的内存进行读写操作 。 而索引和内存地址的变换工作则是由编译器自动实现的。
数组的定义中所指定的数据类型, 也表示一次能够读写的内存大小。char类型的数组以1 个字节为单位对内存进行读写,而short类型和long类型的数组则分别以2个字节、 4个字节为单位对内存进行读写。数组是使用内存的基本。 本章后半部分会讲述各种各样的内存使用技能,其中每一种都需要以数组为基础。之所以说数组是内存的使用方法的基础, 是因为数组和内存的物理构造是一样的。特别是1字节类型的数组, 它和内存的物理构造完全一致。不过,如果只能逐个字节地来读写, 程序就会变得比较麻烦,因而可以指定任意数据类型来定义数组。 这和将1层=1单元的楼房改造成多个楼层=1单元的楼房是同一个道理
4.栈,队列以及环形缓冲区
栈和队列, 都可以不通过指定地址和索引来对数组的元素进行读写。 需要临时保存计算过程中的数据、 连接在计算机上的设备或者输人输出的数据时, 都可以通过这些方法来使用内存。 如果每次保存临时数据都需指定地址和索引, 程序就会变得比较麻烦,因此要加以改进。栈和队列的区别在于数据出入的顺序是不同的。在对内存数据进行读写时,栈用的是LIFO(Last Input First Out, 后人先出)方式,而队列用的则是FIFO(First Input First Out, 先人先出)方式。如果我们在内存中预留出栈和队列所需要的空间, 并确定好写入和读出的顺序,就不用再指定地址和索引了。如果要在程序中实现栈和队列, 就需要以适当的元素数来定义一个用来存储数据的数组, 以及对该数组进行读写的函数对。当然,在这些函数的内部, 对数组的读写会涉及索引的管理, 但从使用函数的角度来说,就没有必要考虑数组及索引了。