(33)'c++:COMPLETE REFERENCE' 第一部分 第四章(数组和以空字符结束的字符串) 第八节

来源:互联网 发布:python 储存空间 编辑:程序博客网 时间:2024/05/29 03:16

数组的初始化

      C/C++经常在声明数组的同时对数组进行初始化.数组的初始化类似于其它变量.如下:

type_specifier array_name[size1]...[sizeN] = {value_list};

      value_list是用逗号格开的一列数值,它们的数据类型要与type_specifier兼容.第一个数值对应数组的第一个元素,依此类推.注意在}后面还有有分号.
      下面的例子中对一个含有10个元素的整型数组进行了初始化.

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

这里i[0]将会赋值为1,依次,i[9]将会赋值为10.
      字符数组有一种简易的赋值方式:

char array_name[size] = "string";

例如下面的例子中,数组将用这种方式初始化赋值为短语"I like C++".

char str[11] = "I like C++";

等价于:

char str[11] = {'I',' ','l','i','k','e',' ','C','+','+','/0'};

      因为这种字符串以null结尾,所以必须确保数组的长度能够顾及到null的位置.这个数组的长度是11,尽管字符串"I like C++"的长度仅仅是10.当使用字符串常量的时候,编译器自动在常量后面加上空字符.
      多维数组的初始化和一维数组类似.例如,下面的程序把二维数组sqrs初始化为1到10以及它们的平方.

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

      当初始化多维数组的时候,可以在每一维的初始值上加上花括号.这叫做子分组.前面的程序可以写成如下形式:

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.

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

      假设我们准备使用数组定义一个错误消息表,就像下面一样:

char e1[12] = "Read error/n";
char e2[13] = "Write error/n";
char e3[18] = "Cannot open file/n";

      正如你所猜想的,对每一个数组都要人工估计它们的长度是非常单调和乏味的事情.幸运的是,这个工作可以由编译器自动完成.如果在一个数组初始化的语句中,数组的长度未被指定,编译器会自动计算数组的长度,让它的大小刚好能存下所有的初始化数值.这就是未定义大小的数组.用这种方法,错误消息表可以定义如下:

char e1[] = "Read error/n";
char e2[] = "Write error/n";
char e3[] = "Cannot open file/n";

      除了减少乏味的人工计算大小之外,未定义大小的数组还可以允许任意改变数组存储的消息字符串,不必担心长度不正确.未定义大小的数组初始化不仅仅局限于一位数组.对于多维数组来说,最左边的索引大小也可以是未定义的.用这种方式,可以定义各种长度的表,编译器会自动分配足够的空间来存储这个表.例如,使用未定义大小的方式来声明二维数组:

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

这种不定长的数组声明比起定长的具有的优势是,我们可以加上或者缩短表的长度,而用不着专门改变数组的尺寸. 

原创粉丝点击