数组
简介
数组是一组相同类型的值,按照顺序储存在一起。数组通过变量名后加方括号表示,方括号里面是数组的成员数量。
int scores[100];
上面示例声明了一个数组scores
,里面包含100个成员,每个成员都是int
类型。
注意,声明数组时,必须给出数组的大小。
数组的成员从0
开始编号,所以数组scores[100]
就是从第0号成员一直到第99号成员,最后一个成员的编号会比数组长度小1
。
数组名后面使用方括号指定编号,就可以引用该成员。也可以通过该方式,对该位置进行赋值。
scores[0] = 13;
scores[99] = 42;
上面示例对数组scores
的第一个位置和最后一个位置,进行了赋值。
注意,如果引用不存在的数组成员(即越界访问数组),并不会报错,所以必须非常小心。
int scores[100];
scores[100] = 51;
上面示例中,数组scores
只有100个成员,因此scores[100]
这个位置是不存在的。但是,引用这个位置并不会报错,会正常运行,使得紧跟在scores
后面的那块内存区域被赋值,而那实际上是其他变量的区域,因此不知不觉就更改了其他变量的值。这很容易引发错误,而且难以发现。
数组也可以在声明时,使用大括号,同时对每一个成员赋值。
int a[5] = {
22, 37, 3490, 18, 95};
注意,使用大括号赋值时,必须在数组声明时赋值,否则编译时会报错。
int a[5];
a = {
22, 37, 3490, 18, 95}; // 报错
上面代码中,数组a
声明之后再进行大括号赋值,导致报错。
报错的原因是,C 语言规定,数组变量一旦声明,就不得修改变量指向的地址,具体会在后文解释。由于同样的原因,数组赋值之后,再用大括号修改值,也是不允许的。
int a[5] = {
1, 2, 3, 4, 5};
a = {
22, 37, 3490, 18, 95}; // 报错
上面代码中,数组a
赋值后,再用大括号重新赋值也是不允许的。
使用大括号赋值时,大括号里面的值不能多于数组的长度,否则编译时会报错。
如果大括号里面的值,少于数组的成员数量,那么未赋值的成员自动初始化为0
。
int a[5] = {
22, 37, 3490};
// 等同于
int a[5] = {
22, 37, 3490, 0, 0};
如果要将整个数组的每一个成员都设置为零,最简单的写法就是下面这样。
int a[100] = {
0};
数组初始化时,可以指定为哪些位置的成员赋值。
int a[15] = {
[2] = 29, [9] = 7, [14] = 48};
上面示例中,数组的2号、9号、14号位置被赋值,其他位置的值都自动设为0。
指定位置的赋值可以不按照顺序,下面的写法与上面的例子是等价的。
int a[15] = {
[9] = 7, [14] = 48, [2] = 29};
指定位置的赋值与顺序赋值,可以结合使用。
int a[15] = {
1, [5] = 10, 11, [10] = 20, 21}
上面示例中,0号、5号、6号、10号、11号被赋值。
C 语言允许省略方括号里面的数组成员数量,这时将根据大括号里面的值的数量,自动确定数组的长度。
int a[] = {
22, 37, 3490};
// 等同于
int a[3] = {
22, 37, 3490};
上面示例中,数组a
的长度,将根据大括号里面的值的数量,确定为