数组(array)用于保存一组有顺序、类型相同的数据。每个元素都通过下标访问,数组的长度在创建时确定。
创建数组
数组字面量适合已经知道元素的情况;int counts[4] = {0} 会创建并清零 4 个格子。数组类型写在变量名前面,方括号说明“这是一组该类型的数据”。
int scores[] = {88, 91, 76, 95, 83};
int counts[4] = {0};
counts[0] = 12;
counts[1] = 9;使用 {0} 初始化 int 数组时,所有元素都会变为 0;未初始化的局部数组不会自动获得默认值。数组的格子数由创建时决定。
知识测验
题目
int counts[4] = {0} 执行后,四个元素的值是什么?
访问数组元素
数组下标(index)从 0 开始,所以第一个元素是 scores[0]。长度为 5 的数组,合法下标是 0、1、2、3、4;访问 scores[5] 不会自动报错,而是产生未定义行为。
int scores[] = {88, 91, 76, 95, 83};
printf("%d\n", scores[0]); // 88
printf("%d\n", scores[4]); // 83
scores[2] = 80;
printf("%d\n", scores[2]); // 80互动实验
数组索引探照灯
访问权限免费
点击任意格子,让 C 表达式准确指向一个元素。观察合法下标始终是 0 到 score_count-1。
知识测验
题目
int scores[] = {88, 91, 76}; 时,scores[2] 是多少?
数组长度与循环
内置数组没有 length 字段。这里已知数组有 5 个元素,所以直接写 score_count = 5;最后一个合法下标是 score_count - 1。
int score_count = 5;
for (int i = 0; i < score_count; i++) {
printf("scores[%d] = %d\n", i, scores[i]);
}
for (int i = 0; i < score_count; i++) {
printf("%d\n", scores[i]);
}知识测验
题目
遍历整个数组时,哪个条件不会越界?
固定长度与常用操作
数组可以读取或改写已有元素,也可以用循环查找某个值;这些操作都不会增加或删除格子。
int values[] = {4, 0, 7, 0, 2, 9};
int count = 6;
values[2] = 5;
for (int i = 0; i < count; i++) {
if (values[i] == 0) {
printf("Found 0 at index %d\n", i);
}
}知识测验
题目
关于 C 数组,哪一句正确?
动手练习
把数组中的 0 移到末尾
给定数组 {0, 1, 0, 3, 12},保持非零元素的相对顺序,把所有 0 原地移动到末尾。
- 使用 read 下标扫描每个元素。
- 使用 write 下标记录下一个非零元素应写入的位置。
- 扫描结束后,将 write 到数组末尾的格子全部补为 0。
动手练习
原地反转整数数组
使用两个下标 left 和 right,从数组两端向中间移动并交换元素。输入 {2, 4, 6, 8, 10},输出 {10, 8, 6, 4, 2}。
- 设置 left 指向首元素、right 指向末元素。
- 交换两端元素后同时向中间移动。
- 当 left 不再小于 right 时停止,并输出数组。