InfoCode

C++ · 数组

一维数组:定义、初始化、下标与越界

学习 C++ 一维数组初始化与从零开始的下标,通过正向访问和逆序输出识别合法范围,避免数组越界。

InfoCode 编写 · 技术参考见下文

在应用中练这个知识点 在应用中阅读讲解

数组长度与合法下标

声明一个数组 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表示有四项,不是最后一项的下标。先预测最后一项和总和,再逐项追踪:

ii < 4访问的元素累加后的sum
0真a[0] = 88
1真a[1] = 311
2真a[2] = 516
3真a[3] = 218
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],实现逆序输出。

提示

先修知识

技术参考

范围说明

本站讲解由 InfoCode 编写,不是官方考纲;参考级别是本站映射,不代表官方等级、认证或参赛资格。练习记录不等于掌握或资格。

参考级别:GESP 3 级(本站映射)

查看赛事关系与路径