学习辅导:一维数组
要记录一位同学的身高,可以定义一个变量,然后将身高存入变量即可。如果有1000位同学呢?难道要创建1000个变量分别存储每位同学的身高吗?很显然,这么操作过于繁琐和死板,于是,C++的设计者创造了一种特殊的变量,确切来说是一种数据结构:用一个变量存储若干数据(反言之,将若干个数据构造成一个变量),数组(Array)。
一、认识数组
1、什么是数组
数组是一组具有相同数据类型的有序的数据的集合。一个数组可以存储大量数据,相当于一次性批量定义了很多变量。虽然数组里有多个数据,但数组是一个整体,它的内存空间是连续的。当数组内的元素都是单个数据的的时候(只有一个维度,即一列数据),叫作“一维数组”。
2、一维数组的声明
跟普通变量定义相似,先声明类型,再声明名称,紧跟着加一对方括号,再填入一个数字,表示存储数据的个数,即数组长度或大小。
一维数组声明示例:
// 声明一个整型数组 a,数组的长度为 10
int a[10];
以上示例,声明了一个一维数组 a,该数组有 10 个成员(也叫元素),且每个成员的数据类型都是 int 类型。注意:1、声明数组的时候,必须要指明长度;2、数组的成员编号(索引)从0开始。上面例子中,数组长度 10 是必须要指明的,数组 a 的第一个成员的索引(编号)是 0,最后一个成员的索引(编号)是 9。
3、一维数组的访问与赋值
普通变量声明之后,不赋初值也能访问,但是访问到的数据不确定。同样,数组声明之后,不赋初值也能访问,访问到的数据也不确定。直接使用数组名称,访问到的是数组在内存中的地址。如果想要访问数组里面的元素,需要在数组名称后面加上一对方括号,括号内填入想要访问的元素的索引。
3-1、一维数组访问示例:
# include <bits/stdc++.h>
using namespace std;
int main() {
int a[10]; // 声明 int 类型长度为 10 的一维数组 a
cout << a << endl; // 输出数组 a
cout << a[1] << endl; // 输出数组 a 的 第2个 元素
// 使用 for 循环,输出一维数组 a 的 第6~10个 元素
for (int i = 5; i < 10; i++) cout << a[i] << endl;
return 0;
}
C++可以支持负索引,比如,-1表示最后一个元素,-3表示倒数第3个元素。
如果不赋初值,数组元素是允许访问的,但系统会胡乱返回一个结果。因为计算机的输出具有确定性,所以胡乱返回的结果是不能参与运算的。如果变量想参与运算,必须要赋初值。数组本身只能访问,无法赋值,只能对数组内部的元素进行赋值。
3-2、一维数组元素赋值示例:
# include <bits/stdc++.h>
using namespace std;
int main() {
int a[10]; // 声明 int 类型长度为 10 的一维数组 a
a[0] = 10; // 为数组 a 的第 1 个元素赋值
a[4] = 50; // 为数组 a 的第 5 个元素赋值
a[7] = 80; // 为数组 a 的第 8 个元素赋值
// 使用 for 循环,格式化输出一维数组 a 的 所有元素
for (int i = 0; i < 10; i++) printf("%d --> %d\n", i, a[i]);
return 0;
}
3-3、一维数组批量赋值示例:
# include <bits/stdc++.h>
using namespace std;
int main() {
int a[10]; // 声明 int 类型长度为 10 的一维数组 a
// 使用 for 循环,为数组 a 批量赋值
for (int i = 0; i < 10; i++) a[i] = i;
// 使用 for 循环,格式化输出一维数组 a 的 所有元素
for (int i = 0; i < 10; i++) printf("%d --> %d\n", i, a[i]);
return 0;
}
4、一维数组声明的同时赋初值
跟普通变量一样,可以只声明不赋值,也可以声明的时候,直接赋值。不同的是,数组里有多个元素,所以赋值的时候要给出多个数据,数据与数据之间用英文逗号分隔,并将所有的数据用一对花括号封装起来。
4-1、一维数组声明并赋初值示例:
// 声明一个整型数组 a,数组的长度为 10,并赋初值
int a[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
以上示例,声明了一个长度为10的int类型数组a,同时为每个元素赋初值,第一个元素的值为0,第二个元素的值为1,第三个元素的值为2......第十个元素的值为9。
如果声明的时候,花括号里给定的数据个数小于数组长度会发什么?
请完成以下实验,尝试总结规律。
4-2、数组赋初值实验程序1:
#include <bits/stdc++.h>
using namespace std;
int main() {
// 声明int类型长度为10的数组a,并给定5个初值
int a[10] = {1, 2, 3, 4, 5};
// 使用 for 循环,格式化输出一维数组 a 的 所有元素
for (int i = 0; i < 10; i++) printf("%d --> %d\n", i, a[i]);
return 0;
}
4-3、数组赋初值实验程序2:
#include <bits/stdc++.h>
using namespace std;
int main() {
// 声明int类型长度为10的数组a,并给定1个初值
int a[10] = {0};
// 使用 for 循环,格式化输出一维数组 a 的 所有元素
for (int i = 0; i < 10; i++) printf("%d --> %d\n", i, a[i]);
return 0;
}
4-4、数组赋初值实验程序3:
#include <bits/stdc++.h>
using namespace std;
int main() {
// 声明int类型长度为10的数组a,并给定1个初值
int a[10] = {1};
// 使用 for 循环,格式化输出一维数组 a 的 所有元素
for (int i = 0; i < 10; i++) printf("%d --> %d\n", i, a[i]);
return 0;
}
通过以上实验,我们能得出以下结论:
1、将给定的初始值依次分配给数组元素;
2、没分配到初值的数组元素设为默认值。
思考一下:如何将所有元素都设为1?
4-5、赋初值参考程序1:
#include <bits/stdc++.h>
using namespace std;
int main() {
// 声明int类型长度为10的数组a,并将所有元素设为1
int a[10] = {1, 1, 1, 1, 1, 1, 1, 1, 1, 1};
// 使用 for 循环,格式化输出一维数组 a 的 所有元素
for (int i = 0; i < 10; i++) printf("%d --> %d\n", i, a[i]);
return 0;
}
4-6、赋初值参考程序2:
#include <bits/stdc++.h>
using namespace std;
int main() {
int a[10]; // 声明 int 类型长度为 10 的数组 a
// 使用 for 循环,将数组 a 里的每个元素都设为 1
for (int i = 0; i < 10; i++) a[i] = 1;
// 使用 for 循环,格式化输出一维数组 a 的 所有元素
for (int i = 0; i < 10; i++) printf("%d --> %d\n", i, a[i]);
return 0;
}
以上两种赋初值的方式都可以,根据实际情况,灵活运用。
二、一维数组的长度
1、获取字节长度
sizeof() 函数可以获取给定参数的字节长度。
比如,获取整形变量 n 的字节长度:
int n = 123456; // 声明整型变量 n,并赋初值 123456
cout << sizeof(n) << endl; // 输出该变量占用的字节长度
2、计算数组长度
先使用 sizeof() 函数获取数组的字节长度,再使用 sizeof() 函数获取数组内任意一个元素的的字节长度(通常使用第一个元素),然后两者相除,就能计算出数组内包含元素的个数,即数组的长度。
#include <bits/stdc++.h>
using namespace std;
int main() {
int a[20]; // 声明一个数组
cout << sizeof(a) / sizeof(a[0]); // 输出该数组的长度
return 0;
}
三、数组的变通用法
如果将前10名同学的总分存入列表scores中,那么scores[0]表示第1名的成绩,scores[1]表示第2名的成绩,这种表达总感觉不自然。
我们更习惯用scores[1]表示第1名的成绩,scores[2]表示第2名的成绩。
为此,只需在创建列表的时候,将列表长度设置大一点即可。
在使用的时候,第1个元素(索引为0的元素)忽略不用,从第2个元素(索引号为1的元素)开始使用。
上述示例代码如下:
#include <bits/stdc++.h>
using namespace std;
int main() {
int scores[11]; // 存储前 10 名的成绩,数组长度声明为 11
// 使用 for 循环,跳过 0 号元素,为剩余元素赋值
for (int i = 1; i <= 10; i++) scores[i] = 100 -i;
// 使用 for 循环,依次输出 1~10 名的分数
for (int i = 1; i <= 10; i++) {
printf("第%d名:%d\n", i, scores[i]);
}
return 0;
}

浙公网安备 33010602011771号