定义数组后,它所占的存储单元的值是不确定的。引用数组元素之前,必须保证数组的元素已被赋值予确定的值。除从键盘输入或直接使用赋值语句给数组元素赋值的方式外,C语言还提供了另外一种方式,即在数组定义时就给元素赋初值,元素的初值在“=”后面用一对花括号括起来的初始化列表中给出。
如:
matrix[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};//按元素初始化
经过这样初始化后,数组matirx中的元素如下所示:
1234
5678
9101112
对于二维数组,既可以按元素初始化,也可以按行初始化,如:
matrix[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};//按行初始化
当数组元素的初值全部列于初始话列表中时,可省略对数组的第一维长度的声明,例如:
matrix[][4]={1,2,3,4,5,6,7,8,9,10,11,12};//按元素初始化
或
matrix[][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};//按行初始化
此时,系统自动初始化列表中提供的初值个数对数组的长度定义。
但值得注意的是,第二维的长度声明不能省略,因为在C语言中二维数组在内存中是按行存放的。
如果不声明第二维的长度,那么编译器就无法知道数组有多少列,在列数未知的情况下,即使给定全部初值也无法判断数组究竟有多少行多少列。因为在行列数之积已知时,具体的行列数会有多种可能的组合,不是唯一确定。
初始化列表中的初值个数不能多于数组元素的个数,但可少于数组元素的个数。当初始化列表中提供的初值个数少于数组元素的个数时,系统将自动给后面的元素赋初值0。如
matirx[3][4]={0};
等价于
matirx[3][4]={0,0,0,0,0,0,0,0,0,0,0,0};
需要提醒读者注意的是,数组不能自动初始化0,至少要将数组的第一个元素初始化为0,这样余下的元素才会被自动初始化为0。例如:
matrix[3][4]={{1,2},{5,6},{9,10}};
对数组matirx初始化的结果是:
1200
5600
91000
注意,当给数组部分元素赋初值时,对数组的长度声明不能省略。
当数组被声明为静态存储类型或外部存储类型(即在所有函数外部定义)时,由于数组元素的初始化是在程序运行前(即编译时)执行时,因此在不显示给出初值的情况下,数组元素将被自动初始化为0。
例如
static a[4];
等价于
static a[4]={0,0,0,0};
而自动类型的数组的初始化是在程序运行时执行的。