数组名与下标
在C语言中,引用数组元素最基本、最常用的方法是使用 数组名 和 下标。

(图片来源网络,侵删)
语法格式:
数组名[下标]
关键点:
- 数组名:代表数组在内存中的起始地址,你可以把它想象成一个指向数组第一个元素的“指针”。
- 下标:也称为索引,是一个整数,用于指定你想要访问的元素在数组中的位置。
- 下标从 0 开始:这是C语言(以及许多其他编程语言)非常重要的一个规则,第一个元素的下标是
0,第二个是1,以此类推。
示例代码解析
让我们通过一个完整的例子来理解。
#include <stdio.h>
int main() {
// 1. 声明一个包含5个整数的数组
// 数组名为 scores,可以存放5个 int 类型的数据
int scores[5];
// 2. 使用下标给数组元素赋值
// 下标: 0 1 2 3 4
scores[0] = 95; // 给第一个元素赋值
scores[1] = 88; // 给第二个元素赋值
scores[2] = 76;
scores[3] = 100;
scores[4] = 65;
// 3. 使用下标访问和打印数组元素
printf("第一个学生的分数是: %d\n", scores[0]);
printf("第三个学生的分数是: %d\n", scores[2]);
// 4. 使用循环遍历整个数组
printf("\n所有学生的分数如下:\n");
for (int i = 0; i < 5; i++) {
// 循环变量 i 从 0 开始,到 4 结束
// scores[i] 会依次访问 scores[0], scores[1], ..., scores[4]
printf("学生 %d 的分数: %d\n", i + 1, scores[i]);
}
return 0;
}
输出结果:

(图片来源网络,侵删)
第一个学生的分数是: 95
第三个学生的分数是: 76
所有学生的分数如下:
学生 1 的分数: 95
学生 2 的分数: 88
学生 3 的分数: 76
学生 4 的分数: 100
学生 5 的分数: 65
重要注意事项
数组越界
C语言不会自动检查你的下标是否在有效范围内(即 0 到 数组长度 - 1),如果你使用了超出这个范围的下标,程序会继续访问内存中不属于该数组的空间,这会导致未定义行为。
未定义行为可能包括:
- 程序崩溃(Segmentation Fault)。
- 程序看似正常,但读取或修改了其他变量的值,导致逻辑错误。
- 程序运行结果完全不可预测。
错误示例:
int arr[3] = {10, 20, 30};
// arr 的有效下标是 0, 1, 2
int x = arr[3]; // 危险!访问了数组之外的内存
arr[5] = 100; // 危险!修改了数组之外的内存
如何避免: 始终确保你的循环条件正确,并且在手动使用下标时,确认其值在有效范围内。

(图片来源网络,侵删)
初始化数组时的下标
在声明数组时,如果你提供了初始值列表,可以不指定数组大小,编译器会根据初始值的数量自动确定。
// 正确:编译器会自动创建一个包含3个元素的数组
int numbers[] = {1, 2, 3};
// 等价于 int numbers[3] = {1, 2, 3};
// 错误:部分初始化时,未指定的元素会被初始化为0
int values[5] = {10, 20}; // values[0]=10, values[1]=20, values[2]=0, values[3]=0, values[4]=0
其他引用数组元素的方法
除了使用下标,C语言还提供了指针运算的方式来引用数组元素,这是C语言非常强大和灵活的特性。
使用指针
数组名在表达式中会“衰变”为其第一个元素的地址,我们可以使用指针来访问数组。
#include <stdio.h>
int main() {
int arr[3] = {10, 20, 30};
int *p; // 声明一个整型指针
// 让指针 p 指向数组的第一个元素
p = arr; // 等价于 p = &arr[0];
// 使用指针解引用符 * 来访问元素
printf("第一个元素: %d\n", *p); // *p p 指向的值,即 arr[0]
// 指针可以自增,指向下一个元素
p++; // p 现在指向 arr[1]
printf("第二个元素: %d\n", *p);
p++; // p 现在指向 arr[2]
printf("第三个元素: %d\n", *p);
return 0;
}
指针与下标结合
指针变量也可以像数组名一样使用下标。
int arr[3] = {10, 20, 30};
int *p = arr;
// p[0] 等价于 *p,也等价于 arr[0]
// p[1] 等价于 *(p+1),也等价于 arr[1]
printf("p[1] 的值是: %d\n", p[1]); // 输出 20
使用 sizeof 计算数组和元素大小
sizeof 是一个运算符,用于计算变量或类型的大小,在处理数组时非常有用。
int arr[5] = {0};
// 计算整个数组的大小(单位:字节)
int total_size = sizeof(arr); // 假设 int 是 4 字节,则 total_size 是 5 * 4 = 20
// 计算单个元素的大小(单位:字节)
int element_size = sizeof(arr[0]); // 结果是 4
// 计算数组的元素个数
int num_elements = total_size / element_size; // 结果是 20 / 4 = 5
sizeof 是获取数组元素个数最安全、最可靠的方法,比硬编码数字要好得多。
| 方法 | 语法 | 描述 | 优点 | 缺点 |
|---|---|---|---|---|
| 下标法 | array[index] |
最直观、最常用的方法。 | 代码易读,易于理解。 | 如果下标计算错误,容易导致数组越界。 |
| 指针法 | *pointer 或 *(array + i) |
强大、灵活,效率可能更高(尤其是在循环中)。 | 是C语言的核心特性,与底层内存紧密相关。 | 代码可读性稍差,对新手不友好。 |
| 指针下标法 | pointer[index] |
结合了指针和下标的优点。 | 代码灵活且可读性较好。 | 本质上还是指针运算。 |
对于初学者来说,强烈建议优先使用下标法,因为它最清晰、最不容易出错,当你对C语言有了更深入的理解后,再学习和使用指针方法来编写更高效、更专业的代码,始终要警惕数组越界问题!
