14 Jun 2024
数组是元素的顺序集合,通常这些元素具有相同的类型。
大部分编程语言实现的数组元素都是相同类型
- C:数组中的元素必须是相同数据类型
- C++/GO/JAVA:数组中的元素必须是相同数据类型(可以变相通过特定的对象类型实现)
- Python/JavaScript:数组中的元素可以是不同数据类型
不同编程语言对数组的实现不同,基本上分为两类,一类是相信程序员,分配的内存只负责储存元素,其他的程序员自己负责;另外一类是帮你掩盖底层细节,给程序员减负,程序员开箱即用,分配的内存除了储存数组的元素,还包含储存数组的元数据。
- 以C举例:仅分配数据空间,分配好内存空间后,元素按照顺序依次储存在内存空间中。数组的元数据(例如长度)需要程序员自己维护
- 以python举例:列表是一个对象,它包含一个指向实际数据存储的数组的指针、数组的长度、以及其他管理数据。
示例:
数组arr,容量为4,赋值{1, 2, 3, 4}
假设 int 类型在你的系统中占用4个字节(32位),并假设使用小端序(Little Endian)存储格式(在内存中低位字节在低地址,高位字节在高地址)
在c中,需要分配4*4=16字节的内存,假设地址是0x1000到0x100F,共16个字节
16进制中1位等于二进制4位,所以16进制中的1,相当于1个字节
此种情况下,数组在内存中储存的值如下
地址 内存内容(以十六进制表示) 每个字节的二进制表示
0x1000 +------------+------------+------------+------------+
| 01 | 00 | 00 | 00 | 00000001 00000000 00000000 00000000
+------------+------------+------------+------------+
0x1004 +------------+------------+------------+------------+
| 02 | 00 | 00 | 00 | 00000010 00000000 00000000 00000000
+------------+------------+------------+------------+
0x1008 +------------+------------+------------+------------+
| 03 | 00 | 00 | 00 | 00000011 00000000 00000000 00000000
+------------+------------+------------+------------+
0x100C +------------+------------+------------+------------+
| 04 | 00 | 00 | 00 | 00000100 00000000 00000000 00000000
+------------+------------+------------+------------+