数组由数据类型相同的一系列元素组成。
成都创新互联是一家专注于成都网站建设、成都网站制作与策划设计,青河网站建设哪家好?成都创新互联做网站,专注于网站建设十载,网设计领域的专业建站公司;建站业务涵盖:青河等地区。青河做网站价格咨询:18980820575
通过声明数组告诉编译器数组中内含多少元素和这些元素的类型。 编译器根据这些信息正确地创建数组。
float candy[365];
char code[12];
int states[50];
方括号 []
表明candy、 code和states都是数组, 方括号中的数字表明数组中的元素个数。
要访问数组中的元素, 通过使用数组下标数(也称为索引) 表示数组中
的各元素。 数组元素的编号从 0
开始。
int powers[8] = {1,2,4,6,8,16,32,64};
推荐使用宏定义数组长度,只需修改 #define
这行代码即可
要创建只读数组, 应该用 const
声明和初始化数组
const int days[MONTHS] = {31,28,31,30,31,30,31,31,30,31,30,31};
存储类别警告:数组和其他变量类似, 可以把数组创建成不同的存储类别(storage class),第12章将介绍存储类别的相关内容。本章描述的数组属于自动存储类别
当初始化列表中的值少于数组元素个数时, 编译器会把剩余的元素都初始化为 0
。
如果初始化列表的项数多于数组元素个数, 编译器可没那么仁慈, 它会毫不留情地将其视为错误。
如果初始化数组时省略方括号中的数字, 编译器会根据初始化列表中的项数来确定数组的大小。
const int days[] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31 };
sizeof days
是整个数组的大小(以字节为单位),sizeof day[0]
是数组中一个元素的大小(以字节为单位)。整个数组的大小除以单个元素的大小就是数组元素的个数。C99 增加了一个新特性: 指定初始化器(designated initializer) 。 利用该特性可以初始化指定的数组元素。
对于传统的C初始化语法,要初始化指定元素,则必须同时初始化其之前的所有元素。
int arr[6] = {0,0,0,0,0,212}; // 传统的语法
int arr[6] = {[5] = 212}; // 把arr[5]初始化为212
[4] = 31,30,31
, 那么后面这些值将被用于初始化指定元素后面的元素。days[1]
初始化为 28, 但是 days[1]
又被后面的指定初始化 [1] = 29
初始化为 29。int days[MONTHS] = { 31, 28, [4] = 31, 30, 31, [1] = 29 };
在使用数组时, 要防止数组下标超出边界。 也就是说, 必须确保下标是有效的值。
归功于 C 信任程序员的原则。 不检查边界, C 程序可以运行更快。 编译器不会检查数组下标是否使用得当。 在C标准中, 使用越界下标的结果是未定义的。 这意味着程序看上去可以运行, 但是运行结果很奇怪, 或异常中止。
sizeof
表达式被视为整型常量, 但是(与C++不同) const
值不是。 另外, 表达式的值必须大于 0int n = 5;
int m = 8;
float a1[5]; // 可以
float a2[5*2 + 1]; //可以
float a3[sizeof(int) + 1]; //可以
float a4[-4]; // 不可以, 数组大小必须大于0
float a5[0]; // 不可以, 数组大小必须大于0
float a6[2.5]; // 不可以, 数组大小必须是整数
float a7[(int)2.5]; // 可以, 已被强制转换为整型常量
float a8[n]; // C99之前不允许
float a9[m]; // C99之前不允许
float rain[5][12]; // 内含 5 个元素的数组, 每个元素本身是一个内含12个 float 类型值的数组
上述声明中 rain[5]
表明 rain
是一个内含 5 个元素的数组; float [12]
说明每个元素的类型是 float[12]
rain[i]
是一个内含12个 float 类型值的数组,因此该数组的首元素就是 rain[i][0]
,第 2 个元素是rain[0][1]
,以此类推,要访问第 i 个数组的第 j 个元素(编号从 0 开始)即为 rain[i][j]