### 数组类型

数组是一种简单的数据结构，它描述的是一组相同数据类型元素的集合。在内存中，数组是连续存储的。数组按维数划分，可以分为一维数组、二维数组和多维数组。其中，一维数组的定义格式为：

数组类型 数组名称[数组长度];

下面的语句定义了一个包含 5 个元素的一维整型数组。

int nArray[5];

为了使用数组，需要访问数组中的元素。程序中可以通过元素在数组中的位置来访问，这被称之为索引访问或下标访问。下面的语句用于访问数组中的第 2 个元素。

nArray[1] = 10;

数组的访问是通过数组名和下标来实现的。在 C++中数组的下标是从 0 开始的，以数组 nArray 为例，其下标范围为 0…4，其中下标 0 表示第一个数组元素，下标 1 表示第 2 个数组元素…。如果使用下标 5 来访问数组，将会出现数组访问越界，因为下标 5 表示访问数组中的第 6 个元素，而 nArray 只包含 5 个元素。数组访问越界是一件非常危险的事情，在开发程序时应避免出现数组访问越界的情况，C++编译器不能够发现数组访问越界的错误。

在定义数组时，数组维数指定了数组中包含的元素数量，也就是所说的数组长度。数组维数必须大于等于 1，并且必须是一个常量表达式，即在编译时就能够计算出它的值。下面的数组定义是合法的。

const int nSize = 5; //定义一个整型常量

int nArray[nSize]; //合法的数组定义

而下面的数组定义是非法的。

int nSize = 5; //定义整型变量

int nArray[nSize]; //非法的数组定义

因为数组维数必须是常量表达式，而变量 nSize 只能在程序执行到其定义时才能确定大小。

与定义变量类似，定义数组时也可以直接进行初始化。例如，下面的语句在定义数组 nArray 时为其进行了初始化。

int nArray[5] = {4, 5, 8, 6, 9}; //定义数组并进行初始化

在为数组进行初始化时也可以只对数组的部分元素进行初始化。例如数组 nArray 包含 5 个元素，只对前 4 个元素进行初始化。

int nArray[5] = {4, 5, 8, 6}; //对数组部分元素进行初始化

如果数组中包含 5 个元素，而我们在初始化时提供了 6 个元素，这将导致编译错误，提示太多的初始化。例如：

int nArray[5] = {4, 5, 8, 6, 9, 10}; //错误的定义

在定义数组时如果显示地提供初始值，则可以不指定数组的长度。例如：

int nArray[] = {4, 5, 8, 6, 9}; //不指定数组长度

此时，数组 nArray 的长度为 5。

在定义数组时如果需要将数组中的所有元素初始化为 0，可以简写为如下的形式。

int nArray[5]= {0};

在对数组进行初始化时，如果只对部分元素进行了初始化，则不初始化的元素默认为 0。因此下面的语句将数组 nArray 中的第一元素初始化为 1，其他元素为 0，而不是将所有的元素初始化为 1。

int nArray[5]= {1};

在介绍完一维数组，接下来介绍二维数组。在 C++中二维数组的定义格式为：

数组类型 数组名[常量表达式][常量表达式];

下面的语句定义了一个二维整型数组。

int nArray[3][4]; //定义一个二维数组

与一维数组相同，二维数组也是通过数组名和下标来访问的，只是数组的下标有两个。例如，下面的语句访问了二维数组中的元素。

nArray[1][2] = 100; //访问二维数组元素

在二维数组中，第一维称为行维，第 2 维称为列维，这样二维数组 nArray 有 3 行，每行有 4 个元素，共计有 12 个元素。对于二维数组来说，可以将第一维 nArray[3]中的每一个元素认为是一个数组，包含 4 个元素，如图 1 所示。

图 1 二维数组示意图

在定义二维数组时也可以为数组元素进行初始化。例如，下面的语句用于为二维数组 nArray 进行初始化。

int nArray[3][4] = {

{1, 2, 3, 4},

{5, 6, 7, 8},

{9, 10, 11, 12}

};

也可以使用一个大括号初始化二维数组的所有元素。例如：

int nArray[3][4] = {

1, 2, 3, 4,

5, 6, 7, 8,

9,10, 11, 12

};

但是，该方法并不提倡。如果数组元素过多的话，很难界定每一个元素。与一维数组类似，二维数组也可以只对部分元素进行初始化。例如：

int nArray[3][4]; = { {1},{2},{3} };

结果是对每一行第一个元素赋值，其他元素为 0。

在定义二维数组时，如果需要提供全部元素的初始值，可以省略第一维的长度，但是不能省略第二维的长度。例如：

int nArray[][4] = {1,2,3,4,5,6,7,8,9,10,11, 12};

int nArray[][4] = {1,2,3,4,5,6,7,8,9,10,11};

注意：最后一行代码，只提供了11个元素的初始值，但是数组nArray却包含12个元素，最后一个元素被初始化为0。