C++基础 学习笔记六:复合类型之数组
c++基础 学习笔记六:复合类型之数组
什么是数组
数组是有序的元素序列,是用于储存多个相同类型数据的集合。
数组的定义
1. 声明公式(一维)
1. 静态数组
typename arrayname[arraysize];
2. 动态数组
typename* arrayname = new typename[arraysize];
2. 关于数组的名词解释
-
数组名
将有包含有限个类型相同的变量的集合命名,那么这个集合的名称为数组名。
-
元素
组成数组的各个变量称为数组的元素。
-
下标
数组的元素从第一个编号为0,依次往后按自然数序列排序。数组的各个元素的数字编号称为下标。
-
长度
数组所包含的所有元素的数量称为数组的长度。
-
大小
元素的大小 * 数组的长度 = 数组的大小
-
前驱
在长度为n的数组中
对于任何
0 ≤ i < j < n
,a[i]
都是a[j]
的前驱(predecessor)。特别地,对于任何
1 ≤ i
,a[i - 1]
称作a[i]
的直接前驱(intermediate predecessor)。 -
后继
在长度为n的数组中
对于任何
0 ≤ i < j < n
,a[j]
都是a[i]
的后继(successor)。特别地,对于任何
i ≤ (n-2)
,a[i + 1]
称作a[i]
的直接后继(intermediate successor)。 -
前缀
任一元素的所有前驱构成其前缀(prefix)。
-
后缀
任一元素的所有后继构成其后缀(suffix)。
-
物理地址
对于一维数组
a[n]
,每个元素占用s
个单位的空间,则元素a[i]
对应的物理地址为:a + i * s
。
数组的声明、初始化与释放
1. 声明
1. 一维数组
-
静态数组
int s_1darray[2];
-
动态数组
int* d_1darray = new int[2];
2. 二维数组
-
静态数组
int s_2darray[2][3];
-
动态数组
int** d_2darray = new int*[2]; for(int i = 0; i < 2; i++) d_2darray[i] = new int[3];
3. 三维数组
-
静态数组
int s_3darray[2][3][4];
-
动态数组
int*** d_3darray = new int**[2]; for(int i = 0; i < 2; i++) { d_3darray[i] = new int*[3]; for(int j = 0; j < 3; j++) d_3darray[i][j] = new int[4]; }
关于声明
-
静态数组
[]
的值必须在编译时是已知的,即不能为变量。 -
动态数组
[]
的值可以是变量。 -
特别的
[]
中的值可以为0。
2. 初始化
1. 一维数组
-
静态数组
int s_1darray_inited[2] = {1,2};
-
动态数组
int* d_1darray_inited = new int[2]();
2. 二维数组
-
静态数组
int s_2darray_inited[2][3] = {{1,2,3},{4,5,6}};
-
动态数组
int** d_2darray_inited = new int*[2]; for(int i = 0; i < 2; i++) d_2darray_inited[i] = new int[3]();
3. 三位数组
-
静态数组
int s_3darray_inited[2][3][4] = {{{1,2,3,4},{5,6,7,8},{9,10,11,12}}, {{12,11,10,9},{8,7,6,5},{4,3,2,1}}};
-
动态数组
int*** d_3darray_inited = new int**[2]; for(int i = 0; i < 2; i++) { d_3darray_inited[i] = new int*[3]; for(int j = 0; j < 3; j++) d_3darray_inited[i][j] = new int[4](); }
关于初始化
-
静态数组
如果不主动初始化那么基本类型数组中的数据则是“脏数据”,但是全局变量和静态变量系统会将元素初始化为指定类型的默认值。特别的类类型会调用默认的构造函数,并且基本类型数组若初始化列表为空则系统会将元素初始化为元素的默认值。
当在初始化的序列中,如果序列中的值的数目小于数组的长度,那么剩余的元素会自动初始化为默认值。
-
动态数组
如果不主动初始化那么数组中的数据则是“脏数据”。
3. 释放
1. 一维数组
动态数组
delete[] s_1darray;
2. 二维数组
动态数组
for(int i = 0; i < 2; i++) delete[] d_2darray[i];
3. 三维数组
动态数组
for(int i = 0; i < 2; i++) { for(int j = 0; j < 3; j++) delete[] d_3darray[i][j]; }
关于释放
-
静态数组
静态数组分配在内存的栈里,在函数执行完以后,静态数组会出栈销毁。这是由系统自动完成的。
-
动态数组
动态分配的内存在堆上,系统无法自动释放堆上的内存,需要主动释放。
数组的使用例子
#include<iostream> using namespace std; int main() { int s_1darray[2]; int* d_1darray = new int[2]; int s_2darray[2][3]; int** d_2darray = new int*[2]; for(int i = 0; i < 2; i++) d_2darray[i] = new int[3]; int* s_3darray[2][3][4]; int*** d_3darray = new int**[2]; for(int i = 0; i < 2; i++) { d_3darray[i] = new int*[3]; for(int j = 0; j < 3; j++) d_3darray[i][j] = new int[4]; } delete[] s_1darray; for(int i = 0; i < 2; i++) delete[] d_2darray[i]; for(int i = 0; i < 2; i++) { for(int j = 0; j < 3; j++) delete[] d_3darray[i][j]; } int s_1darray_inited[2] = {1,2}; int* d_1darray_inited = new int[2](); int s_2darray_inited[2][3] = {{1,2,3},{4,5,6}}; int** d_2darray_inited = new int*[2]; for(int i = 0; i < 2; i++) d_2darray_inited[i] = new int[3](); int s_3darray_inited[2][3][4] = {{{1,2,3,4},{5,6,7,8},{9,10,11,12}}, {{12,11,10,9},{8,7,6,5},{4,3,2,1}}}; int*** d_3darray_inited = new int**[2]; for(int i = 0; i < 2; i++) { d_3darray_inited[i] = new int*[3]; for(int j = 0; j < 3; j++) d_3darray_inited[i][j] = new int[4](); } for(int i = 0; i < 2; i++) cout << s_1darray_inited[i] << " "; cout << endl << endl; for(int i = 0; i < 2; i++) { for(int j = 0; j < 3; j++) cout << s_2darray_inited[i][j] << " "; cout << endl; } cout << endl; for(int i = 0; i < 2; i++) { for(int j = 0; j < 3; j++) { for(int k = 0; k < 4; k++) cout << s_3darray_inited[i][j][k] << " "; cout << endl; } } return 0; } /* 运行结果为: 1 2 1 2 3 4 5 6 1 2 3 4 5 6 7 8 9 10 11 12 12 11 10 9 8 7 6 5 4 3 2 1 -------------------------------- process exited after 0.5921 seconds with return value 0 请按任意键继续. . . */