一、数组的概念
由一系列类型相同的元素构成。
二、数组的声明
数组声明中包括数组元素的数目和元素的类型。编译器根据这些信息创建合适的数组,数组元素可以具有同变量一样的类型。下面是数组声明的例子:
int main()
{
int arr[20];
char code[12];
float candy[50];
}
三、数组的初始化
程序中经常会用数组来存储数据。例如,含有7个元素的数组可以用来存储一周的天数。这种情况下,程序在一开始就初始化数组比较方便,下面介绍初始化的方法:
int main()
{
int power[8] = {1, 2, 3, 4, 5, 6, 7, 8}; /*ANSI C 支持这种初始化的方式*/
}
以上可以看出,可以使用花括号括起来的一系列数值初始化数组。数组元素的下标是从零开始的,数组的首元素(power[0])被初始化为1,依次类推,最后power[7]的值为8(如果你的编译器不支持这种初始化,提示这是一个语法错误,那么你使用的是ANSI以前的编译器。在数组的定义之前添加关键字static即可)。
有时需要使用只读数组,也就是程序从数组中读取数值,但是程序不向数组中写数据。这种情况下声明并初始化数组时,建议使用关键字const。在声明const数组时对其初始化,因为在声明之后,不能在对它赋值。
与普通变量一样,数组在初始化之前的值是随机值。
1.当数组被初始化的数目少于数组元素的数目时,未被初始化的元素被设置为0。
2.当数组初始化列表中的项目的个数大于数组的大小时,根据编译器不同会有一个容错大小,在vs2008中允许初始化数组的的项目个数大于数组自身大小两个存储单位,在Linux中允许初始化数组的的项目个数大于数组自身大小一个存储单位,在vs2017中,运行下面代码及结果如图所示:
# include <stdio.h>
# include <windows.h>
int main()
{
int i;
int arr[10];
for (i = 0; i <= 11; ++i)
{
arr[i] = 0;
printf("%d ", i);
}
printf("\n");
printf("%p\n", &i);
printf("%p\n", &arr[11]);
printf("%p\n", &arr);
system("pause");
return 0;
}
代码及结果分析: 在声明变量i和数组时,先打印了一下i的地址和数组首元素的地址,由运行结果可以看出,变量i的地址和数组首元素的地址差30个16进制数,即相差值等同于12个数组元素(int型变量的大小为4个字节)所占的空间大小,也就是说i的地址应该和arr[12]的地址相同。
数组初始化注意的两点:
1.使用方括号对数组进行初始化时,编译器会根据方括号中的数值来确定数组大小。
2.求数组大小时可以用(sizeof 数组名) / (sizeof 数组首元素的大小)的方法求取数组的大小。 此处补充一下,除了sizeof后直接跟数组名 和 &后直接跟数组名 这两种情况下数组名表示整个数组以外其他的情况数组名均不表示整个数组。
下面介绍一种指定数组元素初始化的方法:
# include <stdio.h>
# include <windows.h>
# define MONTHS 13
int main()
{
int i = 0;
int arr[MONTHS] = { 31, 28,[7] = 31, 30, 31,[1] = 29 };
for (i = 0; i < 13; ++i)
{
printf("%2d. %d\n", i+1, arr[i]);
}
system("pause");
return 0;
}
读者请注意观察代码和输出结果,可以通过指定数组下标的方法初始化数组元素,如果多次对一个元素初始化,则最后一次有效。
四、数组的赋值
声明完数组后,可以借助数组的下标对数组的成员进行赋值。 注意:C不允许把数组作为一个整体来进行赋值,也不支持用花括号括起来的列表 形式进行赋值(初始化的时候除外)。
五、数组边界
使用数组的时候,需要注意的数组所有不能超过数组的边界。编译器不会检查索引的合法性,程序也许 能够运行,但是运行结果可能很奇怪,也可能会异常中断程序的执行。
需要记住的一件事是数组的计数是从零开始的。避免这个问题可以才用的方法是在数组的声明中使用符号常量,然后在需要使用数组大小的地方都直接引用符号常量。
六、二维数组的初始化
1. 二维数组的初始化是建立在对一维数组的的初始化上的。
2. 二维数组在内存中也是连续存放的。