想象一下,你现在是一名老师,要记录班级里5个同学的数学成绩。如果不用数组,你可能会这样做:记录第一个同学成绩用 score1 = 90,第二个同学 score2 = 85,第三个 score3 = 95…… 但如果班级有100个同学,要写100个这样的变量,不仅麻烦,而且管理所有成绩时,你得一个个找、一个个改,效率极低。

这时候,数组就能派上用场了!数组就像一个“有序的容器”,可以把所有同学的成绩打包成一个整体,让你能方便地访问、管理这些数据。

一、数组到底是什么?

简单来说,数组(Array)是一组相同类型的数据元素,按照一定顺序排列,每个元素通过“索引”(也就是位置编号)来访问

举个例子,上面的5个同学成绩,可以用一个数组表示为:
scores = [90, 85, 95, 78, 92]

这里:
- scores 是数组的名字(变量名);
- 方括号 [] 里的是数组的“元素”,每个元素都是数字(类型相同);
- 每个元素都有一个“位置编号”,我们称之为“索引”,从 0 开始。

二、数组的核心结构:索引与访问

数组最关键的特点是索引从0开始。第一个元素的位置是 0,第二个是 1,第三个是 2,以此类推。

1. 声明与初始化

不同编程语言声明数组的语法略有不同,但核心思想一致。以 Python 为例:

# 声明一个空数组(长度5),或直接初始化(已知元素)
scores = [90, 85, 95, 78, 92]  # 长度为5的数组
scores = [0] * 5               # 声明长度为5的数组,元素全为0

2. 访问元素

要获取数组中的某个元素,直接用“数组名[索引]”即可。比如:

print(scores[0])  # 输出第一个元素:90
print(scores[3])  # 输出第四个元素:78

注意:如果索引超出数组长度(比如数组只有5个元素,你访问 scores[5]),就会报错(比如 Python 会提示 IndexError),所以索引范围要在 0长度-1 之间。

三、数组的基本操作

1. 遍历数组

“遍历”就是按顺序访问数组中的所有元素。用循环就能轻松实现:

for score in scores:
    print(score)  # 依次打印90、85、95、78、92

2. 插入元素

假设我们要给数组插入一个新成绩(比如第6个同学,成绩80),并放在第3个位置(索引2)。此时需要:
- 把索引2及之后的元素向后移动一位(原索引2的95→索引3,原索引3的78→索引4,原索引4的92→索引5);
- 将新成绩80放在索引2的位置。

操作后数组变成:[90, 85, 80, 95, 78, 92]

3. 删除元素

如果要删除索引2的元素(比如成绩80),则需要:
- 将索引3及之后的元素向前移动一位(原索引3的95→索引2,原索引4的78→索引3,原索引5的92→索引4);

操作后数组变成:[90, 85, 95, 78, 92]

四、数组的特点与优缺点

1. 核心特点

  • 类型相同:数组中所有元素必须是同一种数据类型(比如全是整数、全是字符串,不能混合不同类型,除非语言允许动态类型,如 Python 的列表);
  • 索引从0开始:第一个元素位置为 0,方便计算地址;
  • 连续存储:元素在内存中是连续排列的,因此可以通过索引直接定位,访问速度极快。

2. 优缺点

  • 优点:访问速度快(通过索引直接定位,时间复杂度 O(1));
  • 缺点:插入/删除效率低(需要移动后续元素,时间复杂度 O(n),n 为数组长度);静态数组大小固定(无法动态扩容)。

五、为什么要学数组?

数组是数据结构的“基石”。你可能会想:“数组这么简单,有什么用?”其实,后续学习的链表、栈、队列、哈希表等结构,很多都是基于数组的思想设计的。比如:
- 栈可以用数组实现“后进先出”;
- 哈希表的底层存储也常依赖数组的索引特性。

理解数组的核心思想(“通过索引快速访问、连续存储”),能帮你更清晰地分析和设计其他复杂结构。

总结

数组是一组相同类型数据的有序集合,通过索引从0开始访问,元素在内存中连续存储。它的优势是访问快,缺点是插入/删除麻烦。虽然看似简单,但它是所有数据结构的基础。掌握数组,你就能迈出数据结构学习的第一步!

小夜