1. 数组下标与类型
数组的索引从 0 开始。例如,一个包含 10 个元素的数组,其合法下标范围为 0 到 9,而不是 1 到 10。为了表示下标,通常使用 size_t 类型,它是一种与机器相关的无符号整型,足够大以存放内存中任意对象的大小。size_t 定义在头文件 <cstddef>
中。
示例代码:
#include <iostream>
#include <cstddef> // 定义 size_t
using std::cout;
using std::endl;int main() {int arr[10]; // 定义一个含有10个元素的数组// 输出数组的合法索引范围for (size_t i = 0; i < 10; ++i)cout << "Index " << i << endl;return 0;
}
2. 使用下标运算符访问数组元素
数组的元素可以通过下标运算符 []
直接访问。例如:
#include <iostream>
using std::cout;
using std::endl;int main() {int scores[11] = {}; // 定义一个含有11个无符号整型元素的数组,并将所有元素初始化为0// 例如,用于统计分数段:0~9, 10~19, …, 90~99, 100unsigned grade;while (std::cin >> grade) {if (grade <= 100)++scores[grade / 10]; // 计算分数段下标,并将对应计数值加1}// 输出所有计数值for (auto cnt : scores)cout << cnt << " ";cout << endl;return 0;
}
在上述代码中,scores
数组用于统计不同分数段的成绩个数。例如,若输入的成绩为 42,则 42/10
得 4,于是将 scores[4] 加1。注意:数组的下标操作直接由 C++ 语言提供,程序员必须保证下标合法,否则将导致未定义行为。
3. 使用范围 for 语句遍历数组
与 vector 和 string 类似,遍历数组最简洁的方法是使用范围 for 语句。由于数组的大小是类型的一部分,编译器知道数组中包含多少个元素,因此可以自动遍历所有元素:
#include <iostream>
using std::cout;
using std::endl;int main() {int scores[11] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10};// 使用范围 for 遍历数组for (auto count : scores)cout << count << " ";cout << endl;return 0;
}
这个循环会依次输出数组中每个元素的值。
4. 检查下标的合法性
下标访问是数组操作中最常见的方法,但使用时必须保证下标在合法范围内。下标必须大于或等于 0 且小于数组大小。如果使用了越界的下标,编译器不会报错,但运行时会产生不可预测的行为,严重时会导致缓冲区溢出等安全问题。
例如:
#include <iostream>
using std::cout;
using std::endl;int main() {int arr[10] = {0};// 错误示例:访问 arr[10] 超出范围(合法索引是 0 到 9)// cout << arr[10] << endl; // 未定义行为return 0;
}
因此,访问数组元素时一定要确保下标正确,必要时可将下标作为 size_t 类型,并在逻辑上严格检查。
5. 小结
- 数组下标:数组索引从 0 开始,一个包含 n 个元素的数组的合法下标范围为 0 到 n-1。
- size_t 类型:建议使用 size_t 表示数组索引,因为它是无符号类型且足够大,定义在
<cstddef>
中。 - 下标运算符:使用
[]
可直接访问数组中已存在的元素;请确保下标在合法范围内,防止未定义行为。 - 范围 for 语句:可以用范围 for 语句遍历数组,编译器根据数组大小自动处理,不必人工控制循环计数。
- 检查下标:程序员必须负责检查下标是否合法,避免数组越界导致安全问题。
通过正确地访问数组中的元素,你可以高效地操作固定大小的容器,同时在代码中明确保证下标安全,避免缓冲区溢出等严重错误。
参考资料
- cppreference.com 关于内置数组和 size_t 的详细说明
- 各大 C++ 编码规范(如 Google C++ Style Guide)中对数组访问的建议
希望这篇文章能帮助你全面了解数组元素的访问方式和注意事项,从而在实际编程中更安全、有效地使用数组。