5.1.3 数组的初始化
大家有没有想过,在定义好数组后,数组中各元素的值是什么呢?其实数组和变量类似,如果将数组定义成全局的或者静态的,那么编译器会将数组存储在静态区,并对数组进行默认初始化,将数组中所有元素的值初始化为 0。而局部的非静态的数组存储在栈上,编译器不会对其进行默认初始化,因此数组中各元素的值就是未确定的。
1.全部初始化
可以通过手工的方式对数组进行初始化,格式为:
数据类型 数组名[整型常量表达式] = {初始值列表};
即在数组定义的后面跟上一个赋值运算符和一对大括号,在大括号内是初始值列表,可以把数组元素的初始值放在大括号内,如果有多个初始值,则用逗号进行分隔。数组中的所有元素都具有相同的数据类型,因此,所有的初始值必须和数组元素的数据类型匹配。例如:
int a[5] = {10, 20, 30, 40, 50};
定义了一个长度为 5 的 int 类型数组 a,同时对其进行初始化,初始值列表由 5 个整型常量构成,即初始值的个数与数组元素个数相同,这就是全部初始化方式。编译器会将各数组元素初始化为所对应的那个初始值,如图 5.2 所示。
图 5.2 数组 a 全部初始化后各元素的值
采用全部初始化方法时,初始值列表中的初始值个数不要多于数组元素的个数,不然编译的时候会给予警告或错误的信息,毕竟也没有这么多数组元素需要初始化。
另外,采用全部初始化方法时,C 语言允许使用空中括号的形式进行数组的定义。例如:
int a[] = {10, 20, 30, 40, 50};
对于这种情况,编译器会根据初始值列表中初始值的个数来确定数组的大小,即保证数组拥有和初始值个数相同的数组元素,并将各数组元素初始化为对应的初始值。
若无初始值列表,则不可使用空中括号形式进行数组的定义:
int a[]; //错误
由于无初始值列表,编译器无法确定数组的大小,所以这是一种错误的行为。
2.部分初始化
数组初始化时,还可在初始值列表中给出少于数组元素个数的初始值。例如:
int a[5] = {10, 20};
初始值列表中只有 2 个初始值,少于数组元素的个数,称为部分初始化方式。针对这种情况,编译器会将前 2 个数组元素初始化为对应的初始值,而剩余的数组元素值被初始化为 0,结果如图 5.3 所示。
图 5.3 数组 a 部分初始化后各元素的值
部分初始化的方式常用来将数组中的元素全部初始化为 0:
int a[5] = {0};
初始值列表中只有 1 个 0,编译器会将它作为数组中第 1 个元素的初始值,而剩余的数组元素值也都会被编译器初始化为 0。结果就是数组中所有元素的值全部为 0。
3.指定初始化
采用部分初始化方式,只能给位置靠前的数组元素赋初始值。我们也可以通过指定初始化的方式,给数组中任意位置的数组元素赋初始值。在初始值之前使用中括号加数字来指定它所对应的数组元素的下标,即“[下标] =初始值”。什么是下标呢?下标就是数组元素的位置或者索引。需要注意的是,C 语言规定,数组的下标是从 0 开始的,不像我们日常生活中的计数都是从 1 开始的。也就是说,数组中第 1 个元素的下标是 0,第 2 个元素的下标是 1,最后一个元素的下标是数组元素个数减 1。
下面就采用指定初始化的方式对数组进行初始化:
int a[5] = {[2] = 10, [4] = 20};
在初始值列表中,初始值 10 前面的下标为 2,表示将数组中的第 3 个元素初始化为 10;初始值 20 前面的下标为 4,表示将数组中的第 5 个元素初始化为 20。剩余的数组元素,编译器会将其初始化为 0,结果如图 5.4 所示。
图 5.4 数组 a 指定初始化后各元素的值
采用指定初始化的方式,初始化顺序仍是按照初始值列表的初始值的先后顺序完成的,与下标值的大小无关。例如:
int a[5] = {[4] = 20, [2] = 10};
虽然下标 2 所对应的数组元素的位置靠前,但由于初始值列表中第一个初始值的下标为 4,所以编译器先将数组第 5 个元素初始化为 20,然后才将数组第 3 个元素初始化为 10。
需注意的是,指定初始化方式是可以与非指定初始方式结合使用的,例如:
int a[5] = {[4] = 20, [2] = 10, 30};
可以看到,在初始值列表中,初始值 30 的前面并没有指定下标,编译器会根据它的前一个(下标为 2 的)初始化对象,将下一个(下标为 3 的)数组元素作为初始化对象,即将数组中第 4 个数组元素初始化为 30。
最后需要说明的是,对于数组来说,只能被初始化,而不可以被赋值。例如:
int a[5]; a = {1, 2, 3, 4, 5}; //错误,数组不能被赋值
数组虽然不能被赋值,但数组元素是可以的。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论