嵌套循环和二维数组
int maxtemps[4][5];
该声明意味maxtemps是一个包含4个元素的数组,其中每个元素都是一个由5个整数组成的数组。
可以将mantemps看作有4行组成,其中每一行有5个整数值。
maxtemps[0]是maxtemps数组的地一个元素,因此maxtemps[0]本身就是一个由5个int组成的数组。
maxtemps[0]的的一个元素是maxtemps[0][0],该元素是一个int。可以认为第一个下标表示行,第二个下标表示列。
假设要打印数组所有的内容,可以用一个for循环来改变行,用另一个被嵌套的for循环来改变列:
for (int row = 0; row < 4; row++)
{
for (int col = 0; col < 5; ++col)
cout << maxtemps[row][col] << "\t";
cout << endl;
}
1. 初始化二维数组
创建二维数组时,可以初始化其所有元素。由于每个元素本身就是一个数组,因此,初始化由一系列逗号分隔的一维数组初始化组成:
int maxtemps[4][5] =
{
{96, 100, 87, 101, 105},
{96, 98, 91, 107, 104},
{97, 101, 93, 108, 107},
{98, 103, 95, 109, 108}
};
程序5.20
#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;
}
程序5.20初始化了一个二维数组,并使用了一个嵌套循环。这一次循环的书序相反,将列循环(城市索引)放在外面,将行循环(年份索引)放在里面。另外,它还将一个指针数组初始化为一组字符串常量。也就是说,将cities声明为一个char指针数组。这使得每个元素都是一个char指针,可被初始化为一个字符串的地址,程序将cities[0]初始化为字符串”Gribble City”的地址。因此,该指针数组的行为与字符串数组类似。
在这个例子中,可以使用char数组的数组,而不是字符串指针数组:
char cities[Cities][25] =
{
"Gribble City",
"Gribbletown",
"New Gribble",
"San Gribble",
"Gribble Vista"
};
上述方法将全部5个字符串的最大长度限制为24个字符。指针数组存储5个字符串的地址,而是用char数组的数组时,将5个字符串分别复制到5个包含25个元素的char数组中,因此,从存储空间的角度说,使用指针数组更为经济;然而,如果要修改其中任何一个字符穿,则二维数组是更好的选择。这两种方法使用的初始化列表相同,显示字符串的for循环相同。
另外,还可以使用string对象数组,而不是字符串指针数组:
const string cities[Cities] =
{
"Gribble City",
"Gribbletown",
"New Gribble",
"San Gribble",
"Gribble Vista"
};
如果希望字符串是可修改的,应省略const。