第五节 · 剥皮的技巧 · 数组与成员访问

在生活中,我们经常会遇到需要同时处理一批同类物品的情况。比如一打鸡蛋、一盒巧克力、一排座位——它们都是同一类东西的集合。

在 C++ 中,我们也有类似的概念——数组。数组允许我们将多个相同类型的数据放在一起,用一个名字来统一管理它们。


假设我们需要记录一个班级 5 名学生的成绩。如果不用数组,我们可能需要这样做:

int score1 = 85;
int score2 = 90;
int score3 = 78;
int score4 = 92;
int score5 = 88;

这样写不仅繁琐,而且如果班级有 50 名学生,难道我们要声明 50 个变量吗?

使用数组,我们可以这样做:

int scores[5] = {85, 90, 78, 92, 88};

这一行代码就声明了一个包含 5 个整数的数组,名为 scores。方括号中的数字 5 表示数组的长度,也就是它能容纳多少个元素。花括号中的内容是数组的初始值


数组中的每个元素都有一个索引(index),用于标识它在数组中的位置。C++ 中的数组索引从 0 开始

scores[0] = 85    // 第一个元素
scores[1] = 90    // 第二个元素
scores[2] = 78    // 第三个元素
scores[3] = 92    // 第四个元素
scores[4] = 88    // 第五个元素

要访问数组中的某个元素,使用 数组名[索引] 的形式:

同样,我们也可以修改数组中的元素:

注意:数组索引从 0 开始,所以一个长度为 n 的数组,其有效索引范围是 0 到 n-1。如果访问超出范围的索引,程序可能会产生不可预料的结果,这被称为数组越界


使用下标运算符[])访问数组元素,实际上是一种运算操作。下标运算符接受一个索引值,返回对应位置的元素。

下标运算符不仅可以用于数组,还可以用于其他一些类型,比如指针和标准库中的 vectorstring 等容器。我们将在后续章节中详细学习这些内容。

让我们用一个循环来遍历数组中的所有元素:

这段代码会依次输出数组中的每个元素。变量 i 从 0 循环到 4,每次循环都通过 scores[i] 访问对应位置的元素。


除了访问数组元素,我们在实际编程中还经常需要访问复杂数据结构的成员

还记得我们之前提到过的自定义数据结构吗?当我们定义了一个结构体或类时,可以使用成员访问运算符.)来访问其中的成员:

成员访问运算符 . 用于访问对象的成员。它左边是对象本身,右边是成员的名字。


如果我们有的是指向对象的指针,而不是对象本身,该怎么访问成员呢?

一种方法是先解引用,再用点号:

但这样写太麻烦了。C++ 提供了一个更简洁的箭头运算符->):

箭头运算符 -> 结合了解引用和成员访问两个操作,使代码更加简洁易读。


让我们来看一个综合的例子——管理一个班级的学生信息:

在这个例子中,我们将数组和结构体结合使用。students[i] 获取第 i 个学生对象,然后用 .name.score 访问该学生的姓名和成绩。


数组还可以是多维的。比如,我们可以用一个二维数组来表示一个矩阵:

多维数组的每一维都需要一个索引。matrix[i][j] 表示第 i 行第 j 列的元素(索引都从 0 开始)。


习题

  • 声明一个包含 7 个整数的数组,用于存储一周每天的步数,然后计算并输出这一周的总步数和平均步数。

  • 定义一个表示书籍的结构体,包含书名、作者和价格三个成员。创建一个包含 3 本书的数组,并输出所有书籍的信息。

Last updated