数组是具有一定顺序关系的若干相同类型变量的集合体,组成数组的变量称为该数组的元素。

数组是后面的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]; 可以理解为

shuzu.png

其实就是有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

数组元素在内存中顺次存放,它们的地址是连续的。元素间物理地址上的相邻,对应着逻辑次序上的相邻。

例如:

下载.png

数组名其实是一个指针常量, int a[10] —> int const *a ; 它指向数组第一个元素。

二、数组作为函数的参数

数组元素作为实参

与单个变量一致

数组名作为参数

数组名就是一个常量地址,它指向数组第一个元素,函数内对于形参的改变,会影响实参数组。

指针与数组

三、对象数组

对象数组的定义与访问

  • 定义对象数组

类名 数组名[元素个数];

  • 访问对象数组元素

通过下标访问

数组名[下标].成员名

对象数组初始化

数组中每一个元素对象被创建时,系统都会调用类构造函数初始化该对象。

  • 通过初始化列表赋值。

例:Point a[2]={Point(1,2),Point(3,4)};

  • 如果没有为数组元素指定显式初始值,数组元素便使用默认值初始化(调用默认构造函数)。

数组元素所属类的构造函数

  • 元素所属的类不声明构造函数,则采用默认构造函数。
    • 各元素对象的初值要求为相同的值时,可以声明具有默认形参值的构造函数。
    • 各元素对象的初值要求为不同的值时,需要声明带形参的构造函数。
  • 当数组中每一个对象被删除时,系统都要调用一次析构函数。