第四章 熟练使用有棱有角的内存

 说起内存,我只知道内存具有读/写功能,可以从硬盘中读出程序,然后由CPU进行处理。但是,当我看完这章后,我发现不止这么简单,就内存的物理机制来说,内存是一种名为内存IC的电子元件,内存IC中有电源、地址信号、数据信号、控制信号等用于输出的大量引脚,通过为其指定地址来进行数据读写。

    其中A0~A9可以指定1024个地址,D0~D7表示一次可以读写一个字节的数据。读数据是:VCC +5V GND:0V RD:1 WR:0;写数据是:VCC +5V GND:0V RD:0 WR:1。

    数据类型,就是所占用的内存大小,在程序中可以通过其数据类型能够以特定字节数为单位进行读写,例如short a,short占2个字节,其可以读写2个字节的数据。还有就是通过使用变量,即便不指定物理地址,也可以在程序中对内存进行读写,这是因为,操作系统会自动决定变量的物理地址。

    指针,是用于存储内存地址的变量,定义指针时,需要在变量名前加上*,这表示从指针存储的地址中一次能够读写的数据字节数。如long*e,假使指针地址从50开始,则一次读写则为50 51 52 53这四个地址。

    数组,在内存中是连续存放的,他与内存的物理构造是一样的 所以说数组是高效使用内存的基础。索引和内存地址的变化工作是由编译器自动实现的。

    栈和队列,都可以不通过指定地址和索引来对数组元素进行读写,若需要临时保存计算过程中的数据、连接在计算机上的设备或者输入输出的数据时,都可以使用这些方法来使用内存。栈和队列的区别在于,栈是用后入先出的方式,而队列是用先入先出的方式。队列一般是以环状缓冲区的方式来实现的。

    链表和二叉树,两者是不用考虑其索引的顺序就可以对数组进行读写操作。使用链表可以更加高效地对数组数据(元素进行追加和删除)处理,使用二叉树可以更加高效地对数组进行检索。使用链表对数组进行追加和删除,因为数组是连续存放在内存中的,其索引是连续的,若要删除其元素,只需将“下一个元素”的值改为要删除的元素的下一个值,例如,要删除索引为5的元素,则需在索引为4的元素的“下一个元素”改为6即可;若要在删除的位置添加元素,其顺序为最后一个元素之后,则需将最后一个元素的“下一个元素”设为之前添加元素的索引的值,将其新增的元素的“下一个元素”设为-1(这个值是非所存在的前面的数值)。二叉查找树是在链表的基础上进行操作的,考虑到数据的大小关系,将其分成左右两个方向的表现形式(左边是与其元素相比小的,右边则是大的)。例如一个数组,其元素数值为45 50 38 29 47 40 67 54,从第一个元素检索,值45 “左边的元素”为2(索引),“右边的元素”为1,第二个元素50,“左边的元素”为4,“右边的元素”为6,第三个元素38,“左边的元素”为3,“右边的元素”为5,第四个元素29,“左边的元素”为-1,“右边的元素”为-1,第五个元素47,“左边的元素”为-1,“右边的元素”为7,第六个元素40,“左边的元素”为-1,“右边的元素”为-1,第七个元素67,“左边的元素”为-1,“右边的元素”为-1,第八个元素54,“左边的元素”为-1,“右边的元素”为-1。

posted @ 2019-02-16 16:30  心有远方  阅读(160)  评论(0编辑  收藏  举报