3 数组
3.1 一维数组
概述:数组就是一个集合,里面存放了相同类型的数据元素。
特点:
- 存放在一块连续的内存空间
- 数组中每个元素都是相同的数据类型
- 通过下标访问数组元素(数组的下标是从0开始的)
3.1.1 一维数组定义方式
主要有三种:
- 数据类型 数组名[数组长度];
- 数据类型 数组名[数组长度]={值1,值2,…};
- 数据类型 数组名[]={值1,值2,…};
例1(数组的定义及遍历)
定义1
//定义1
int arr1[5];
//给数组赋值
for (int i = 0; i < sizeof(arr1) / sizeof(int); i++) {
arr1[i] = i;
}
//输出数组
for (int i = 0; i < sizeof(arr1) / sizeof(int); i++) {
cout << arr1[i] << endl;
}
sizeof返回的是字节数,这里数组的长度为数组的总字节数/单个元素类型的字节数
运行结果:
定义2
//定义2
int arr2[5] = { 1,2,3,4,5 };
//输出数组
for (int i = 0; i < sizeof(arr2) / sizeof(int); i++) {
cout << arr2[i] << endl;
}
cout << "-------------------------------" << endl;
在初始化数据的时候,如果没有全部填完,会用0填补剩余数据
运行结果:
定义3
//定义3
int arr3[] = { 10,20,30,40,50 };
//输出
for (int i = 0; i < sizeof(arr3) / sizeof(int); i++) {
cout << arr3[i] << endl;
}
必须要有初始长度
运行结果:
3.1.2 一维数组数组名
作用:
- 可以统计整个数组在内存中的长度
- 可以获取数组在内存中的首地址
例2(数组名用途)
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
cout << "整个数组占用内存空间为:" << sizeof(arr) << endl;
cout << "每个元素占用内存空间为:" << sizeof(int) << endl;
cout << "数组中元素个数为:" << sizeof(arr)/ sizeof(int) << endl;
运行结果:
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
cout << "数组首地址为:" << arr << endl;
//&为取址字符
cout << "数组第一个元素地址为:" << &arr[0] << endl;
运行结果:
数组名是常量,不可以进行赋值操作
例3(数组元素逆置)
int a[] = { 1,2,3,4,5,6,7};
cout << "数组逆置前为:" << endl;
for (int i = 0; i < sizeof(a) / sizeof(int); i++) {
cout << a[i] << " ";
}
cout << "\n数组逆置前后:" << endl;
int temp = 0;
int end = sizeof(a) / sizeof(int) - 1;
int length = sizeof(a) / sizeof(int);
for (int i = 0; i < length/2; i++) {
temp = a[i];
a[i] = a[end];
a[end] = temp;
end--;
}
//加强版for循环
for (int t : a) {
cout << t << " ";
}
注意点:用到变量temp来替换元素;加强版for循环要掌握。
3.2 二维数组
3.2.1 二维数组定义方式
主要有四种:
- 数据类型 数组名[行数][列数];
- 数据类型 数组名[行数][列数]={ {数据1,数据2} , {数据3,数据4} };
- 数据类型 数组名[行数][列数]={ 数据1,数据2 , 数据3,数据4 };
- 数据类型 数组名[ ][列数]={ 数据1,数据2 , 数据3,数据4 };
建议:以上四种定义方式,利用第二种更加直观,提高代码的可读性
定义1
//1)数据类型 数组名[行数[列数];
//分配内存空间
int b1[2][3];
//赋值
b1[0][0] = 1;
b1[0][1] = 2;
b1[0][2] = 3;
b1[1][0] = 4;
b1[1][1] = 5;
b1[1][2] = 6;
//输出
for (int i = 0; i < 2; i++) {
for (int j = 0; j < 3; j++) {
cout << b1[i][j] << endl;
}
}
运行结果:
定义2
//2)数据类型 数组名[行数[列数]={ {数据1,数据2} , {数据3,数据4} };
int b2[2][3] = {
{1,2,3},
{4,5,6}
};
for (int i = 0; i < 2; i++) {
for (int j = 0; j < 3; j++) {
cout << b2[i][j] << endl;
}
}
运行结果:
定义3
//3)数据类型 数组名[行数[列数]={ 数据1,数据2 , 数据3,数据4 };
int b3[2][3] = { 1,2,3,4,5,6 };
for (int i = 0; i < 2; i++) {
for (int j = 0; j < 3; j++) {
cout << b3[i][j] << endl;
}
}
运行结果:
定义4
//4)数据类型 数组名[ ][列数]={ 数据1,数据2 , 数据3,数据4 };
int b4[][3] = { 1,2,3,4,5,6 };
for (int i = 0; i < 2; i++) {
for (int j = 0; j < 3; j++) {
cout << b4[i][j] << endl;
}
}
运行结果:
3.2.2 二维数组数组名
作用:
例4(二维数组名用途)
int b2[2][3] = {
{1,2,3},
{4,5,6}
};
cout << "二维数组占用空间为:" << sizeof(b2) << endl;
cout << "二维数组第一行占用内存为:" << sizeof(b2[0]) << endl;
cout << "二维数组第一个元素占用内存为:" << sizeof(b2[0][0]) << endl;
cout << "二维数组行数为:" << sizeof(b2) / sizeof(b2[0]) << endl;
cout << "二维数组列数为:" << sizeof(b2[0]) / sizeof(b2[0][0]) << endl;
运行结果:
int b2[2][3] = {
{1,2,3},
{4,5,6}
};
cout << "二维数组首地址为:" << b2<<endl;
cout << "二维数组第一行首地址为:" << b2[0] << endl;
cout << "二维数组第二行首地址为:" << b2[1] << endl;
cout << "二维数组第一个元素首地址为:" << &b2[0][0] << endl;
运行结果:
为什么二维数组的首地址与第一行首地址一样呢,又或者是第一个元素首地址?
解答:
二维数组的地址就是它首元即第一个一维数组a[0]的地址,而一维数组a[0]的地址又是它的首元a[0][0]的地址。所以三者是相同的。
例5(数组综合应用)
题目描述:有三名同学(张三、李四、王五),在一次考试中的成绩分别如下表,请分别输出三名同学的总成绩。
姓名 |
语文 |
数学 |
英语 |
张三 |
100 |
98 |
95 |
李四 |
90 |
75 |
68 |
王五 |
66 |
78 |
98 |
代码实现:
//建立二维数组(初始化)
int scores[3][3];
string names[3] = { "张三","李四","王五" };
//赋三科分数
int a = 0;
int b = 0;
int c = 0;
//计数(下标)
int n = 0;
int m = 0;
//总分
int sum[3];
do {
cout << "请分别输入"<<names[n]<<"的三科成绩:" << endl;
cin >> a >> b >> c;
sum[n] = a + b + c;
scores[n][m++] = a;
scores[n][m++] = b;
scores[n][m] = c;
m = 0;//置为0
n++;
cout<<endl;
} while (n < 3);
//输出
for (int i = 0; i < 3; i++) {
cout << names[i]<< "的总成绩为" << sum[i] << endl;
}
运行结果:
下期讲一讲数组排序问题,这里的总成绩还可以进一步排序。