考纲要求
- 掌握一维数组的定义方式与下标范围,长度为 n 的数组下标是 0 到 n-1。
- 能正确初始化数组并遍历访问,理解未显式初始化的局部数组元素值不确定。
- 掌握求最大值、最小值、总和与平均数等基础操作。
- 能用数组完成查找、计数以及排序前的数据存储等任务。
典型题型
- 给出数组和下标,要求写出访问到的元素。
- 输出数组所有元素或求特定统计量。
- 找出数组中第一个满足条件的元素下标。
常见错误
- 循环写成 i 从 1 到 n,越界访问 a[n] 同时漏掉 a[0]。
- 把数组长度当成可用的最大下标,n 个元素的最大下标是 n-1。
- 在循环内重复初始化累加变量,导致每次统计都从零开始。
- 以为数组可以整体赋值或整体比较,数组名不能这样用。
深入理解
下标从 0 开始,边界要算清楚
int a[10]; 定义了一个能装 10 个整数的数组,合法下标是 0 到 9,不是 1 到 10。访问 a[10] 属于越界,C++ 不会报错,而是读写到数组后面的内存,结果不可预期——可能看起来正常,也可能让程序崩溃,或者悄悄改掉别的变量。这是数组题最危险的错误,因为编译器不拦。
遍历的标准写法是 for (int i = 0; i < n; i++),条件是 < 而不是 <=。如果题目说「位置从 1 开始计数」,那只是输出时加 1,数组下标仍然从 0 开始,两者不要混。
求最大值为什么要同时记下标
只找最大值很简单:先假设第一个元素最大,然后逐个比较、遇到更大的就更新。但题目常常还要求「最大值第一次出现的位置」,这时必须额外用一个变量记下标:
int mx = a[0], pos = 0;
for (int i = 1; i < n; i++)
if (a[i] > mx) { mx = a[i]; pos = i; }注意条件写 > 而不是 >=。写 >= 会记录最后一次出现的位置,题目要「第一次」就必须用严格大于。这个细节是判分点,也是很多人「思路对但答案错」的原因。
初始化与数组大小
int a[100]; 里的元素不会自动清零,它们的值是内存里原有的内容。局部数组要在定义时写 int a[100] = {0}; 才会全部置零——花括号里只写一个 0,其余元素自动补 0。这个写法在求和、计数类题目里必须用。
数组大小要用常量或在定义时就确定。竞赛里通常把上限写死,例如 int a[100005];,比实际数据量大一些,避免越界。用变量当数组大小(变长数组)不是 C++ 标准的一部分,部分编译器支持,考试中不要依赖。
自编例题
一次遍历求最大值与位置
输入 n 个整数,输出最大值以及它第一次出现的位置,位置从 1 开始计数。
int best = a[0], pos = 0;
for (int i = 1; i < n; i++)
if (a[i] > best) { best = a[i]; pos = i; }
cout << best << ' ' << pos + 1 << endl;先把第一个元素当作当前最大值,位置记为 0,然后从下标 1 开始逐个比较。只有严格大于才更新,这样相同最大值出现多次时保留的是第一次的位置。输出时把下标加 1 转成从 1 开始的位置。如果把比较写成大于等于,相同值会不断更新,最后得到的是最后一次出现的位置,与题目要求正好相反。
相关真题
这块内容在整条路线里的位置:GESP C++ 3 级备考路径。
READY TO START
开始练习
先做一套本级别测评,报告会指出哪些知识点需要重点补;再回到本页对照考纲要求逐条核对,把不确定的条目记下来集中练。
常见问题
数组下标为什么从 0 开始?
下标表示相对首元素的偏移量,首元素偏移为 0。这样地址计算最直接,也是 C++ 的规定。
数组越界会怎样?
C++ 不检查越界,可能读到其他变量的值或写坏内存,程序不一定立刻报错,所以边界必须自己保证。
数组长度可以用变量吗?
标准 C++ 要求数组长度是编译期常量。需要动态长度时应使用 vector 或足够大的固定数组。
