一维数组:数组元素可以看做是一行数据。
二维数组:更像是一个表格,既有行数据又有列数据。
C++没有提供二维数组类型,但用户可以创建每个元素本身都是数组的数组。例如,假设要存储 5 个城市在 4 年间的最高气温,可以这样声明数组:
int maxtemps[4][5];
该声明意味着 maxtemps 是一个包含 4 个元素的数组,其中每个元素都是一个由 5 个整数组成的数组,如下图所示,可以将 maxtemps 数组看作由 4 行组成,其中每一行有 5 个温度值。
表达式 maxtemps[0] 是 maxtemps 数组的第一个元素,其本身就是一个由 5 个 int 组成的数组,maxtemps[0] 数组的第一个元素是 maxtemps[0][0],该元素是一个 int。因此,需要使用两个下标来访问 int 元素。可以认为第一个下标表示行,第二个下标表示列,如下图所示。
假设要打印数组的所有内容,可以用一个 for 循环来改变行,用另一个被嵌套的 for 循环来改变列:
for ( int row = 0; row < 4; row++ )
{
for ( int col = 0; col < 5; ++col )
cout << maxtemps[row][col] << "\t";
cout << endl;
}
对于每个 row 值,内部的 for 循环将遍历所有的 col 值,并在每个值之后打印一个制表符,打印完每行后,打印一个换行符。
初始化二维数组
创建二维数组时,可以初始化其所有元素。二维数组的初始化由一系列逗号分隔的一维数组初始化(用花括号括起)组成:
int maxtemps[4][5] =
{
{ 96, 100, 87, 101, 105 },
{ 96, 98, 91, 107, 104 },
{ 97, 101, 93, 108, 107 },
{ 98, 103, 95, 109, 108 }
};
注意:花括号、逗号、分号均不能漏掉!
使用二维数组
下面的示例程序演示了二维数组和嵌套循环的使用:
//nested.cpp -- nested loops and 2-D array
#include <iostream>
const int Cities = 5;
const int Years = 4;
int main()
{
using namespace std;
const char * cities[Cities] =
{
"Gribble City", "Gribbletown", "New Gribble", "San Gribble", "Gribble Vista"
};
int maxtemps[Years][Cities] =
{
{96,100,87,101,105}, {96,98,91,107,104}, {97,101,93,108,107}, {98,103,95,109,108}
};
cout << "Maximum temperatures for 2008 - 2011\n\n";
for (int city = 0; city < Cities; ++city)
{
cout << cities[city] << ":\t";
for (int year = 0; year < Years; ++year)
{
cout << maxtemps[year][city] << "\t";
}
cout << endl;
}
return 0;
}
上面的示例程序初始化了一个二维数组,并使用了一个嵌套循环。这一次,循环的顺序相反,将列循环(城市索引)放在外面,将行循环(年份索引)放在里面。
另外,它还采用了C++常用的做法:将一个指针数组初始化为一组字符串常量。也就是说,将 cities 声明为一个 char 指针数组,这使得每个元素(如 cities[0] )都是一个 char 指针,可被初始化为一个字符串的地址。
在这个示例中,可以使用 char 数组的数组,而不是字符串指针数组,在这种情况下,声明如下:
char cities[Cities][25] = // array of 5 arrays of 25 char
{ "Gribble City", "Gribbletown", "New Gribble", "San Gribble", "Gribble Vista" };
上述方法将全部 5 个字符串的最大长度限制为 24 个字符。指针数组存储 5 个字符串的地址,而使用 char 数组的数组时,将 5 个字符串分别复制到 5 个包含 25 个元素的 char 数组中。因此,从存储空间的角度说,使用指针数组更为经济;然而,如果要修改其中的任何一个字符串,则二维数组是更好的选择。
另外,还可以使用 string 对象数组,而不是字符串指针数组,在这种情况下,声明如下:
const string cities[Cities] = // array of 5 strings
{ "Gribble City", "Gribbletown", "New Gribble", "San Gribble", "Gribble Vista" };
如果希望字符串是可修改的,则应省略限定符 const。在希望字符串是可修改的情况下,string 类自动调整大小的特性将使这种方法比使用二维数组更为方便。