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

    技术2022-05-11  24

    数组的初始化

          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}};

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


    最新回复(0)