一、数据是如何在内存中存储的?
32位系统中char,int型数据在内存中的存储方式:
- char占1byte(8bit)
- int占4byte(32bit)
假设我们有一个int类型的值,它从0x01开始,一个int占据4个字节,则其结束于0x04。
二、数据类型有什么意义?
它确定了一个特定类型的数据到底要申请多大的内存地址来存储数据,并且决定取到的二进制数应该如何解释。
三、同类型的数据在内存中是如何连续存储的?
假设有一个四个数的集合 1、20、300、4000,将它们连续地存储在一起时,在内存里的表现就像是它们紧挨着挤在一起。如果第一个元素从0x01开始,那整个集合就在0x16结束。代表集合的变量指向集合的开始地址0x01,因为一个int类型数据占据4个字节,所以第一个元素就是存储在0x01-0x04的内存地址中,以此类推,就可以得到其他元素。
这种叫做:顺序表的基本布局
四、不同类型的数据集合在内存中是如何存储的?
当不同的元素要存储一个集合里时,用偏移量定位获取每个元素就靠不住了,因为不用数据类型在内存中占用的空间(字节)是不同的。
假设集合里有10、"a"、20、"b" 这四个元素,这时就不能采用上面那种连续存储布局;而是,它们分散存储在不同的地方。这时,就可以申请一块4个元素大小的连续内存区域,里面存的就是对应的元素的内存地址。
这种叫做:元素外置的顺序表
五、顺序表在内存中的结构
要在内存中给集合开辟一块区域,先要确定集合大小(容量)。另外,确定区域后,还要知道当前已经占用了几个元素,一旦溢出,就需要重新申请更大的空间。
要表达这种结构,有两种实现方式:
图a是一体式结构:存储表信息与元素存储区信息安排在一块存储区里
图b是分离式结构:表对象里只保存于整个表有关的信息(容量和元素个数),实际数据元素存放在另一个独立的元素存储区里,通过指针链接
二者区别:
如果增加元素超过了列表的最大存储量时,则需要新建一个数据区.。
一体式结构若想更换数据区,则要整体更改;而分离式结构则只需要更改表信息区中的数据区链接地址即可,即该顺序表对象不变。
六、顺序表扩充
线性扩充:每次扩充增加固定数目的存储位置,节省空间,操作次数多(以时间换空间)。
倍数扩充:浪费空间(以空间换时间),操作次数少,推荐。