您的位置:首页 > 编程语言 > C语言/C++

C++ 初学者指南 第四篇(7)

2010-05-21 16:57 239 查看
必备技能 4.6: 数组的初始化

在C++中我们可以对数组进行初始化。数组的初始化和其它变量的初始化有些类似,如下:

数组类型数组名[数组大小] = {值列表};

其中,值列表中值的类型应该和数组的类型相兼容。列表中所有的值用逗号隔开。列表中的第一个数值会被放置在数组的第一位置上,第二个数值被放置在数组的第二个位置上,以此类推。注意,在{}后面需要紧跟一个分号。

在下面的示例中,我们用数字1到10来初始化一个10个整型数的数组。

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

这意味着,i[0]的值为1,i[9]的值为10。用于存储字符串的字符数组可以采用如下的简易的初始化方式:

char 数组名[数组大小] = "string";

例如,下面的代码片段用字符串“C++”来初始化数组str:

char str[4]=”C++”;

这种写法和下面的写法是等价的:

char str[4]={ 'C', '+', '+', '\n'};

由于在C++中字符串必须是以0结尾的,因此在声明用于存储字符串的字符数组的时候,我们必须保证数组足够大。这也是为什么上面的str数组的大小是4个字符,而不是“C++”中的三个字符。当使用字符串常量的时候,编译器会自动添加0作为字符串的结束标记的。

多维数组的声明和一维数组的声明是类似的。例如,下面的程序中,用数字1到10和它们的平方来初始化数组sqrs:

int sqrs[10][2] =

{

1,1,

2,4,

3,9,

4,16,

5,25,

6,36,

7,49,

8,64,

9,81,

10,100

};

表4-1展示了数组sqrs在内存中的存储影像。

0
1
右索引
0
1
1
1
2
4
2
3
9
3
4
16
4
5
25
5
6
36
6
7
49
7
8
64
8
9
81
9
10
100
左索引
表4-1 sqrs数组的初始化

当初始化多维数组的时候,还可以使用花括号来把每一维的数据括起来。这被称为子集分组。例如,上面的初始化sqrs数组的程序也可以写成:

int sqrs[10][2] =

{

{1,1},

{2,4},

{3,9},

{4,16},

{5,25},

{6,36},

{7,49},

{8,64},

{9,81},

{10,100}

};

当使用子集分组的方式来初始化数组的时候,如果没有提供足够的初始化数据,则剩余的元素都会被自动初始化为0。

下面的程序使用sqrs数组来查找用户键入的一个数字的平方。首先在数组中查找这个数字,然后打印出对应的平方值。

#include <iostream>
#include <cstring>
#include <cctype>

using namespace std;

int main ()
{
int i,j;
int sqrs[10][2] =
{
{1,1},
{2,4},
{3,9},
{4,16},
{5,25},
{6,36},
{7,49},
{8,64},
{9,81},
{10,100}
};

cout << "Enter a number between 1 and 10: ";
cin >> i;

//查找i
for ( j = 0; j < 10 ; j++ )
{
if ( sqrs[j][0] == i )
break;
}

cout << "The square of " << i << " is ";

cout << sqrs[j][1];

return 0;
}


程序的运行结果如下:

Enter a number between 1 and 10: 4

The square of 4 is 16

未指定大小的数组的初始化

当需要在声明时初始化一个数组,我们还可以使用C++提供的自动计算数组大小的功能,只要不指明数组的大小即可。实际上,编译器通过计算初始化数据的个数来创建一个足够大的数组来保存这些初始的数据。例如:

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

这些的写法就是创建了一个名字为nums,大小为4的初始数据为1,2,3,4的数组。

因为没有明确指定数组的大小,这样的数组被称为未指定大小的数组。这样的数组是非常用的。例如,假想我们需要使用初始化数组的方式来定义一个网址的列表,如下:

char e1[16] = "www.osborne.com";

char e2[16] = "www.weather.com";

char e3[15] = "www.amazon.com";

如果手工去计算每个网址中含有的字符的多少来确定数组的大小,这将是一件非常累人的事情。而且,这样很容易计数错误而导致数组的大小设置不当。如果让编译器来计算数组的大小,如下的写法则会更好:

char e1[] = "www.osborne.com";

char e2[] = "www.weather.com";

char e3[] = "www.amazon.com";

这样写除了可以免去累人的手工计数外,这种未指定大小的数组的初始化还可以让我们随便修改字符串的内容,而不用考虑数组的大小是否也需要重新定义。

这种未指定大小的数组的初始化并不局限于针对一维数组。对于多维数组来讲,最左端的维的可以为空。(其它维的大小必须明确指定,以便数组中的元素都可以被正确的索引。)使用这种未指定大小的数组初始化的方法,我们可以构建长度不同的表,由编译器自动为它们分配存储空间。例如,sqrs数组就可以采用未指定大小的数组的初始化的方式来进行初始化:

int sqrs[][2] = {1,1,2,4,3,9,4,16,5,25,6,36,7,49,8,64,9,81,10,100};

这种方法和明确指定数组大小的方式相比较的优点就是通过修改初始化数组列表,这张表的长度可以变长或者变短而不用改变数组维的大小。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: