数组是具有一定顺序关系的若干相同类型变量的集合体,组成数组的变量称为该数组的元素。
数组是后面的Vector容器的基本储存结构。
一、数组的定义与初始化
类型说明符 数组名 [常量表达式] [常量表达式]…
- 例如:int a[10];
表示a为整型数组,有10个元素:a[0]…a[9] - 例如: int a[5] [3];
表示a为整型二维数组,其中第一维有5个下标(0 ~ 4),第二维有3个下标(0 ~ 2),数组的元素个数为15,可以用于存放5行3列的整型数据表格。
一维数组的初始化
在定义数组时给出数组元素的初始值。
- 列出全部元素的初始值
例如:static int a[10]={0,1,2,3,4,5,6,7,8,9};
- 可以只给一部分元素赋初值
例如:static int a[10]={0,1,2,3,4};
- 在对全部数组元素赋初值时,可以不指定数组长度
例如:static int a[]={0,1,2,3,4,5,6,7,8,9}
二维数组的初始化
- 将所有初值写在一个{}内,按顺序初始化
- 例如:static int a[3] [4]={1,2,3,4,5,6,7,8,9,10,11,12
- 分行列出二维数组元素的初值
- 例如:static int a[3] [4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};
- 可以只对部分元素初始化
- 例如:static int a[3] [4]={{1},{0,6},{0,0,11}};
- 列出全部初始值时,第1维下标个数可以省略
- 例如:static int a[][4]={1,2,3,4,5,6,7,8,9,10,11,12};
- 或:static int a[][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};
注意:
- 如果不作任何初始化,内部auto型数组中会存在垃圾数据,static数组中的数据默认初始化为0;
- 如果只对部分元素初始化,剩下的未显式初始化的元素,将自动被初始化为0;
通过二维数组的存储理解多维数组
- 按行存放
例如: float a[3] [4]; 可以理解为
其实就是有3行 a[4] 或者说 3行4列:(以下数值是下标)
0 | 1 | 2 | 3 |
---|---|---|---|
4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 |
数组的使用
必须先声明,后使用。
只能逐个引用数组元素,而不能一次引用整个数组
例如:a[0]=a[5]+a[7]-a[2*3]
例如:b[1] [2]=a[2] [3]/2
数组元素在内存中顺次存放,它们的地址是连续的。元素间物理地址上的相邻,对应着逻辑次序上的相邻。
例如:
数组名其实是一个指针常量, int a[10] —> int const *a ; 它指向数组第一个元素。
二、数组作为函数的参数
数组元素作为实参
与单个变量一致
数组名作为参数
数组名就是一个常量地址,它指向数组第一个元素,函数内对于形参的改变,会影响实参数组。
三、对象数组
对象数组的定义与访问
- 定义对象数组
类名 数组名[元素个数];
- 访问对象数组元素
通过下标访问
数组名[下标].成员名
对象数组初始化
数组中每一个元素对象被创建时,系统都会调用类构造函数初始化该对象。
- 通过初始化列表赋值。
例:Point a[2]={Point(1,2),Point(3,4)};
- 如果没有为数组元素指定显式初始值,数组元素便使用默认值初始化(调用默认构造函数)。
数组元素所属类的构造函数
- 元素所属的类不声明构造函数,则采用默认构造函数。
- 各元素对象的初值要求为相同的值时,可以声明具有默认形参值的构造函数。
- 各元素对象的初值要求为不同的值时,需要声明带形参的构造函数。
- 当数组中每一个对象被删除时,系统都要调用一次析构函数。