网络

教育改变生活

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 82|回复: 0
打印 上一主题 下一主题

【C语言】数组的初始化

[复制链接]

686

主题

693

帖子

3101

积分

版主

Rank: 7Rank: 7Rank: 7

积分
3101
跳转到指定楼层
楼主
发表于 2024-12-6 12:58:27 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
如果没有显式地初始化数组变量,那么就会采用一般规则:如果数组具有动态存储周期,那么数组元素的值就是没有定义的。否则,所有的元素都会被默认地初始化为 0(如果数组元素是指针,则会被初始化为NULL)。编写初始化列表当在定义数组时,若要显式地初始化数组,必须使用初始化列表(initialization list):这是用逗号分隔开的初始化器(initializer)列表,也就是将每个数组元素的初始值放在大括号 {} 内。如下所示:
  • int a[4 = { 1, 2, 4, 8 };



上述定义使得数组 a 中的元素具有下面的初始值:
  • a[0 = 1, a[1 = 2, a[2 = 4, a[3 = 8



当初始化一个数组时,请注意下面的规则:

(1) 不能在定义长度可变数组时,进行初始化操作。

(2) 如果数组具有静态存储周期,那么该数组的初始化器必须是常量表达式。如果数组具有动态存储周期,那么可以在初始化器中使用变量。

(3) 如果提供了初始化列表,那么可以在数组定义中省略数组长度,数组长度由初始化器列表中最后一个数组元素的索引值决定。例如,前面例子中数组a的定义,等同于下面代码:
  • int a[  = { 1, 2, 4, 8 };   // 有4个元素的数组



(4) 如果一个数组的定义同时包含了对数组长度指定和初始化列表,那么长度是通过方括号内的表达式指定的。任何元素只要在列表中没有对应的初始化器,就会被初始化为 0(对于指针类型,则初始化为 NULL)。如果列表中所包含初始化器比数组元素更多,则多出来的初始化器直接被忽略。

(5) 最后一个初始化值后面如果还有多余的逗号,则忽略此逗号。

根据这些规则,下面的定义都是等价的:
  • int a[4 = { 1, 2 };
  • int a[]  = { 1, 2, 0, 0 };
  • int a[]  = { 1, 2, 0, 0, };
  • int a[4 = { 1, 2, 0, 0, 5 };



在最后一行代码的数组定义中,初始化器5被忽略了。当这种不匹配的情况发生时,大多数编译器会发出警告。

数组的初始化器必须与数组元素具有相同的类型。如果数组元素类型是联合、结构或者数组类型,那么每个初始化器则又会是另一个初始化列表。例如:
  • typedef struct { unsigned long pin;
  •                  char name[64];
  •                  /* ... */
  •                } Person;
  • Person team[6 = { { 1000, "Mary"}, { 2000, "Harry"} };



数组的其他 4 个元素会被初始化为 0,按照本例情况,为{0,""}。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

WEB前端

QQ|手机版|小黑屋|金桨网|助学堂  咨询请联系站长。

GMT+8, 2024-12-22 19:58 , Processed in 0.033426 second(s), 21 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表