C++ · 数组
一维数组:定义、初始化、下标与越界
学习 C++ 一维数组初始化与从零开始的下标,通过正向访问和逆序输出识别合法范围,避免数组越界。
数组长度与合法下标
声明一个数组 int a[5];,表示有 5 个格子,编号是 0、1、2、3、4(不是 1 到 5!)。
访问元素用 a[下标],比如 a[0] 是第一个元素,a[4] 是最后一个。
类比:楼房的 0 层(地下室)到 4 层,共 5 层,但最高写 a[4]。
下标可以是变量,比如 a[i]——这是循环遍历数组的核心写法。
下标越界:访问 a[-1] 或 a[5](对于大小为 5 的数组)属于越界,程序行为是未定义的(可能崩溃,也可能输出奇怪的值)。
4个元素,为什么最后一个下标是3?
把 int a[4] = {8, 3, 5, 2}; 画成四个槽位:下标0、1、2、3分别存8、3、5、2。长度4表示有四项,不是最后一项的下标。先预测最后一项和总和,再逐项追踪:
| i | i < 4 | 访问的元素 | 累加后的sum |
|---|---|---|---|
| 0 | 真 | a[0] = 8 | 8 |
| 1 | 真 | a[1] = 3 | 11 |
| 2 | 真 | a[2] = 5 | 16 |
| 3 | 真 | a[3] = 2 | 18 |
| 4 | 假,结束 | 不访问a[4] | 18 |
错误一:写成 i <= 4,会尝试访问不存在的第5项。错误二:把 a[-1] 当成最后一项;普通C++数组没有这种倒数规则。越界属于未定义行为,不能靠一次运行没有崩溃来判断安全。
本例显式初始化所有元素;普通局部数组没有初始化时,不能假定内容全为0。容量与有效长度也要分开:数组能放100项而当前只有n项时,只遍历这n项,并保证0≤n≤100。遍历n项是O(n),普通数组一次合法下标访问是O(1)。
运行验证:最后一项与完整遍历
#include <iostream>
int main() {
int a[4] = {8, 3, 5, 2};
int sum = 0;
for (int i = 0; i < 4; ++i) { sum += a[i]; }
std::cout << a[3] << " " << sum << "\n";
}输出2 18。i到4时已经退出,不会访问a[4]。
先自己判断,再展开答案
int a[1] = {9}; 的最后一项是a[1]吗?
不是。唯一合法元素下标是0,a[0]是9;a[1]不能作为元素读取。
4项数组里要比较a[i]和a[i+1],i从0开始应限制到哪里?
要求i < 3,最大i是2,i+1最大是3。只检查i < 4不够。
容量100的数组,当前有效项数n=0,i < n的遍历执行几次?
从i=0开始执行0次,不访问元素。这里没有声明长度为0的普通数组。
访问元素与逆序遍历
例1:下标从 0 开始的基本用法
#include <iostream>
using namespace std;
int main() {
int a[5] = {10, 20, 30, 40, 50};
cout << a[0] << endl; // 10,第1个元素
cout << a[2] << endl; // 30,第3个元素
cout << a[4] << endl; // 50,最后一个元素
// a[5] 是越界,不能访问!
return 0;
}数组 a 有 5 个元素,合法下标是 0~4。a[0]=10,a[2]=30,a[4]=50。
例2:用下标逆序输出数组
#include <iostream>
using namespace std;
int main() {
int a[5] = {1, 2, 3, 4, 5};
for (int i = 4; i >= 0; i--) {
cout << a[i] << " ";
}
cout << endl; // 输出:5 4 3 2 1
return 0;
}i 从 4 递减到 0,依次访问 a[4]、a[3]...a[0],实现逆序输出。
提示
- 数组下标从 0 开始,n 个元素的最大合法下标是 n-1,访问 a[n] 是越界错误。
- 声明数组 int a[n] 中 n 必须是常量或编译期常量,不能是 cin 读入的变量(部分编译器支持 VLA,竞赛中建议用常量)。
- 字符串数组末尾有终止符 '\0',声明时大小要多留一位。
- 数组初始化 int a[5]={0} 会把所有元素初始化为 0;局部普通数组 int a[5] 不初始化就读取可能产生未定义行为;全局数组默认清零。
先修知识
技术参考
范围说明
本站讲解由 InfoCode 编写,不是官方考纲;参考级别是本站映射,不代表官方等级、认证或参赛资格。练习记录不等于掌握或资格。
参考级别:GESP 3 级(本站映射)