返回介绍

5.1.3 数组的初始化

发布于 2025-04-11 22:32:56 字数 2795 浏览 0 评论 0 收藏 0

大家有没有想过,在定义好数组后,数组中各元素的值是什么呢?其实数组和变量类似,如果将数组定义成全局的或者静态的,那么编译器会将数组存储在静态区,并对数组进行默认初始化,将数组中所有元素的值初始化为 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。