Array



1. 数组的定义

数组是元素的顺序集合,通常这些元素具有相同的类型。

大部分编程语言实现的数组元素都是相同类型

  • C:数组中的元素必须是相同数据类型
  • C++/GO/JAVA:数组中的元素必须是相同数据类型(可以变相通过特定的对象类型实现)
  • Python/JavaScript:数组中的元素可以是不同数据类型

2. 数组在内存中如何储存?

不同编程语言对数组的实现不同,基本上分为两类,一类是相信程序员,分配的内存只负责储存元素,其他的程序员自己负责;另外一类是帮你掩盖底层细节,给程序员减负,程序员开箱即用,分配的内存除了储存数组的元素,还包含储存数组的元数据。

  • 以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
          +------------+------------+------------+------------+

2. 数组的特点

2.1 数组各个操作的时间复杂度

3. 热题100相关题目