在软件开发的过程中,经常会有一组数字一起出现的情况,比如在游戏中的一副扑克排,一个本月的最高分排行榜,一个商品的价格列表等等,这些数组的长度一般都是固定的,这个时候在程序中往往用数组来表示。
例如,学校里进行了一次月考,有数学,语文,英语三门。我们实现一个学生类。用于表示每个学生的成绩状况
class Student
{
public:
string name;
int scores[3]; //数学,语文,英语
int historyHigh[3]; //历史最高成绩
};
数组通过 数组名[索引] 即可对数组中的这个元素进行操作, 在C++中数组的索引是从0开始的(一般编程语言都是从0开始,也有特别的Lua就是从1开始的)。在这个学生类中,我们在scores后面定义一个historyHigh数组用来表示每科的历史最好成绩
#include <iostream>
using namespace std;
//学生
class Student
{
public:
string name;
int scores[3]; //数学,语文,英语
int historyHigh[3]; //历史最高成绩
};
void printScore(Student st)
{
cout<< "学生:" << st.name << " 各科成绩->数学:" << st.scores[0]<< " 语文:"<<st.scores[1] << " 英语:"<< st.scores[2] <<" 最高分->数学:" << st.historyHigh[0]<< " 语文:"<<st.historyHigh[1] << " 英语:"<< st.historyHigh[2] << endl;
}
int main(int argc, const char * argv[]) {
// insert code here...
std::cout << "Hello, World!\n";
Student XiaoMing;
XiaoMing.name = "小明";
XiaoMing.scores[0] = 80;
XiaoMing.scores[1] = 85;
XiaoMing.scores[2] = 90;
XiaoMing.historyHigh[0] = 100;
XiaoMing.historyHigh[1] = 90;
XiaoMing.historyHigh[2] = 95;
printScore(XiaoMing);
//Xcode 中运行这里没有崩溃,如果在windows平台 这样的代码很可能会崩溃 因为XiaoMing.historyHigh[3] 可能是为空
//XiaoMing.historyHigh[3] = 100;
//数组越界会发生什么?
cout << "小明发现英语有一个选择题明明做对了却没给分数" << endl;
//假设粗心的班主任在修改小明的英语分数时候忘记了数组是从0开始的。误以为scores[3] 是小明的英语分数
cout << "班主任说简单,我给你改一改就好了!" << endl;
XiaoMing.scores[3] = 92;
printScore(XiaoMing);
cout << "班主任粗心大意,导致英语分数没有修改成功还把小明的数学最高分给改错了。" << endl;
return 0;
}
运行:
学生:小明 各科成绩->数学:80 语文:85 英语:90 最高分->数学:100 语文:90 英语:95
小明发现英语有一个选择题明明做对了却没给分数
班主任说简单,我给你改一改就好了!
学生:小明 各科成绩->数学:80 语文:85 英语:90 最高分->数学:92 语文:90 英语:95
班主任粗心大意,导致英语分数没有修改成功还把小明的数学最高分给改错了。
需要注意的是,由于在C++中数组是从0开始的,所以虽然scores这个数组虽然长度是3,但是索引最大值是2(索引0,1,2), 那么如果使用 scores[3] 会发生什么呢?
这种情况就是数组越界,在C++中,数组越界是最常见的一种异常,这种时候往往会引起程序的崩溃,但也不是绝对的,像在本例中,scores后面还有一个数组,这时候数组越界就可能会修改到后面这个数组里面某个元素的值。
本程序的索引直接使用3,在Xcode中会提示警告⚠️
Array index 3 is past the end of the array (which contains 3 elements)
但是有时候索引不会直接使用具体的值可能是一个int类型的变量,这个时候Xcode就没有提示了,所以使用数组的时候一定要注意不要让索引值等于或超过数组的长度,如果是变量就要做条件判断。避免数组越界的情况发生