1. 数组:从“储物柜”到“编程利器”
很多刚接触编程的同学,一听到“数组”这个词,就觉得有点抽象,有点难。其实,你完全可以把数组想象成我们生活中常见的储物柜,或者是一排排整齐的抽屉。每个柜子(数组元素)都有一个唯一的编号(数组下标),从0开始计数。你想存东西或者取东西,只要报上对应的编号就行。这个编号,在编程里我们叫它“下标”或者“索引”。
在GESP三级考试里,数组是基础中的基础,也是你从“会写几行代码”到“能解决实际问题”的关键一步。我刚开始学的时候,也犯过不少低级错误,比如总记不住下标是从0开始,结果访问数据老是差一位,调试半天才发现问题。所以,咱们今天就从最根本的定义和操作说起,把这些容易踩的坑都填平。
1.1 数组的定义与初始化:打好地基
定义一个数组,就像去超市租一组储物柜。你得告诉管理员三件事:这组柜子叫什么名字(数组名)、每个柜子放什么类型的东西(数据类型)、以及你需要多少个柜子(数组长度)。在C++里,语法是这样的:
// 数据类型 数组名[长度];
int scores[5]; // 定义一个能存放5个整数的数组,名字叫scores
这里有个新手特别容易掉进去的“坑”:数组的长度必须是一个大于0的整数常量,不能是变量。什么意思呢?看下面这个错误示范:
int n = 10;
int arr[n]; // 错误!长度n是一个变量,编译器会报错
为什么不行?因为程序在编译的时候,就需要知道该给这个数组分配多大的内存空间。如果长度是个变量,它的值在程序运行时才能确定,编译器就懵了:“我到底该预留多少地方?” 正确的做法是使用常量,比如 int arr[10];,或者使用 const 关键字定义一个常量。
定义好了柜子,下一步就是往里面放东西,也就是初始化。初始化方法很多,我推荐几种最常用、最不容易出错的:
// 方法1:定义时直接列出所有元素
int arr1[5] = {10, 20, 30, 40, 50}; // arr1[0]=10, arr1[1]=20, ...
// 方法2:只给部分元素赋值,剩下的自动补0
int arr2[5] = {1, 2}; // arr2[0]=1, arr2[1]=2, arr2[2]到arr2[4]都是0
// 方法3:让编译器自己数有几个元素,自动确定长度
int arr3[] = {1, 2, 3, 4}; // 数组arr3的长度自动被确定为4
// 方法4:快速将所有元素初始化为0(非常实用!)
int arr4[100] = {0}; // 100个元素全部是0
最后一种 {0} 的写法,是我在写项目时最常用的技巧之一,尤其是当你需要一个大数组,并且希望所有值一开始都是0的时候,一行代码就搞定,既清晰又安全。
1.2 数组的访问与“越界”大坑
存取数组元素很简单,用 数组名[下标] 就行。比如 scores[0] = 95; 就是把95放进第一个“柜子”。这里的关键是下标范围:对于一个长度为N的数组,有效的下标是 0 到 N-1。这个“从0开始”的设定,是很多编程语言的惯例,一定要刻在脑子里。
下面这个例子,我们来计算一个班级5个学生的平均分:
#include
using namespace std;
int main() {
int scores[5] = {88, 92, 76, 85, 90};
int sum = 0;
// 使用循环遍历数组,i从0到4
for (int i = 0; i < 5; i++) {
sum += scores[i]; // 累加每个分数
}
double average = sum / 5.0; // 注意用5.0确保结果是浮点数
cout << "班级平均分是:" << average << endl;
return 0;
}
看起来很简单对吧?但这里藏着考试和实际编程中最常见的“杀手”——数组下标越界。什么是越界?就是你试图去打开一个不存在的储物柜。比如 scores[5] 或者 scores[-1]。
更“坑”的是,在C++里,访问越界下标编译器通常不会报错,程序能照常运行,但后果是灾难性的。你可能会读到一片随机、无意义的内存数据,或者更糟,修改了其他重要数据,导致程序出现各种诡异、难以复现的崩溃。我当年就遇到过,一个循环条件写成了 i <= 5,结果程序时不时就崩溃,调试了整整一个下午才找到这个越界访问。
所以,养成好习惯:在写循环遍历数组时,反复检查循环条件,确保下标 i 严格小于数组长度 N。这是保证程序稳定性的第一道防线。


1005

被折叠的 条评论
为什么被折叠?



