for循环、字符串与数组(10)

3.4.2  创建数组

将数组中元素的个数定义为常量是个不错的想法。程序就使用了MAX_ITEMS来表示主人公所能携带的最大物品数目。

const int MAX_ITEMS = 10;

声明数组的方法和声明已见过的变量的方式非常类似:提供一个类型和一个名称。另外,编译器必须知道数组的大小,这样才能预留出需要的内存空间。数组大小的信息可以用方括号括起来,然后置于数组名之后。下面给出声明表示主人公物品栏的数组的方式:

string inventory[MAX_ITEMS];

上面代码声明了一个大小为MAX_ITEMS的string对象数组inventory(因为MAX_ITEMS为10,所以表示10个string对象)。

陷阱

声明数组的时候,可以通过提供一个初始值列表来对数组进行初始化。初始值列表是用花括号括起来的元素序列,其中元素用逗号隔开。如下例所示:

string inventory[MAX_ITEMS] = {"sword", "armor", "shield"};

这段代码声明了大小为MAX_ITEMS的string对象数组inventory。数组的前3个元素初始化为"sword"、"armor"和"shield"。

如果在使用初始值列表的时候忽略元素个数,那么创建的数组大小就等于列表中元素的个数。下面给出一个例子:

string inventory[] = {"sword", "armor", "shield"};

因为初始值列表中有3个元素,因此这行代码创建了一个大小为3的数组inventory,其中元素是"sword"、"armor"和"shield"。

3.4.3  数组的索引

索引数组的方式和索引string对象非常类似。可以使用索引号和下标运算符([])来访问任意单个元素。

接下来,程序用下标运算符给物品栏添加了3个物品:

int numItems = 0;

inventory[numItems++] = "sword";

inventory[numItems++] = "armor";

inventory[numItems++] = "shield";

程序首先定义了numItems,它表示主人公当前携带的物品数,然后将"sword"赋值给了数组的位置0。因为使用的是后置递增运算符,所以数组被赋值后numItems才递增。接下来两行将"armor"和"shield"添加到数组中。代码结束后,numItems理所当然地成为了3。

主人公已经储备了一些物品,现在显示一下他的物品栏:

cout << "Your items:\n";

for (int i = 0; i < numItems; ++i)

{

cout << inventory[i] << endl;

}

这段代码应当让人回忆起字符串索引。代码循环访问inventory的前3个元素,并按顺序显示每个string对象。

接下来,主人公用他的剑换来了一把战斧。这由下面一行代码完成:

inventory[0] = "battle axe";

这段代码用string对象"battle axe"给inventory中位置0的元素重新赋值。于是,inventory的前3个元素分别为"battle axe"、"armor"和"shield"。

陷阱

数组从0开始索引,正如string对象一样。也就是说下面代码定义了一个包含5个元素的数组:

int highScores[5];

合法位置从0到4(包括0和4)。不存在元素highScores[5]!尝试访问highScores[5]可能导致灾难性后果,如程序崩溃。

读书导航