内存IC中邮电源,地址信号,数据信号,控制信号等用于输入输出的大量引脚(IC的引脚),通过为其指定地址(address),来进行数据的读写。现在大家使用的计算机至少有512M的内存。这就相当于512000个(512 MB÷1 KB=512 K)1 KB的内存IC。当然一台计算机中不大可能放入如此多的内存IC。通常情况下计算机使用的内存IC中会有更多的地址信号引脚,这样就能在一个内存IC中存储数十兆字节的数据。因此,只用数个内存IC,就可以达到512 MB的容量。另外像WT和RD这样可以让IC运行的信号称为控制信号。其中当WR和RD同时为0时,写入和读出的操作都无法进行。由此可见内存IC的物理机制实质上是很简单的。
编辑语言中的数据类型表示存储的是何种类型的数据。此外,在不同的编程语言中变量可以指定的数据类型的最大长度也不相同。
指针也是一种变量它所表示的不是数据的值,而是存储着数据的内存的地址。通过使用指针就可以对任意指定地址的数据进行读写。通常情况下指针变量的长度是32位。
数组是指多个同样数据类型的数据在内存中连续排列的形式。作为数组元素的各个数据会通过连续的编号被区分开来这个编号称为索引。指定索引后,就可以对该索引所对应地址的内存进行读写操作。而索引和内存地址的变换工作则是由编译器自动实现的。数组的定义中所指定的数据类型,也表示一次能够读写的内存大小。之所以说数组是内存的使用方法的基础是因为数组和内存的物理构造是一样的。不过如果只能逐个字节来读写程序就会变得比较麻烦因而可以指定任意数据类型来定义数组。使用数组能使编程工作变得更加高效。如果在反复运行的循环处理中使用数组,很短的代码就能达到按顺序读出或写入数组元素的目的。不过,虽然是通过指定索引来使用数组,但这和内存的物理读写并没有特别大的区别,很多程序都会在数组的使用上花费大量功夫。
栈和队列,都可以不通过指定地址和索引来对数组的元素进行读写。需要临时保存计算过程中的数据,连接在计算机上的设备或者输入输出的数据时,都可以通过这种方法来使用内存。如果每次保存临时数据都需指定地址和索引程序就会变得比较麻烦因此要加以改进。栈和队列的区别在于数据出入的顺序是不同的。如果我们在内存中预留出栈和队列所需要的空间,并确定好写入和读出的顺序,就不用再指定地址和索引了。如果要在程序中实现栈和队列,就需要以适当的元素数来定义一个用来存储数据的数组,以及对该数组进行读写的函数对。当然,在这些函数的内部,对数组的读写绘涉及索引的管理,但从使用函数的角度来说,就为有必要考虑数组以及索引了。队列这一方式也称为排队。队列一般是以环状缓冲区的方式来实现的,也就是本章标题中所说的“熟练使用有棱有角的内存”。
在数组的各个元素中,除了数据的值之外,通过为其附带上下一个元素的索引,即可实现链表。数据的值和下个元素的索引组合在一起,就构成了数组的一个元素。这样数组元素相连就构成了念珠式的链表。在需要追加或删除数据的情况下使用链表是很高效的。如果不是用链表数组,那么中途删除或追加元素时,其后的元素就必须要全部移动。而在实际的程序中,有时需要对包含数千至数万个元素的数组进行频繁的数据追加或删除操作。如果每次都需要移动数千至数万个元素,那么哪怕是高速计算机也会花费很长时间。反之,使用代码清单来追加或删除数据则毫不费事。
二叉查找树是指在链表的基础上往数组中追加元素时,考虑到数据的大小关系,将其分成左右两个方向的表现形式。使用二叉查找树的便利之处在于可以使数据的搜索等更有效率。只要在程序开发中多花一些心思,我们就可以熟练地使用内存实现栈处理,链表处理,二叉查找树处理等。