C语言-数组
一、一维数组
数组由一系列类型相同的元素构成。
/* 一些数组声明的例子 */ float candy[365]; // 365 个浮点数的数组 char code[12]; // 15 个字符的数组 int states[50]; // 50 个整数的数组
1.方括号([])表示 candy和其他两个标示符均为数组,方括号内的数字指明了数组所包含的数组元素数量。
2.数组大小:必须大于 0
3.索引(index)(下标数字):从 0 开始计数
4.candy[0]:数组的首元素地址
//数组的初始化 int powers[8] = { 1, 2, 4, 6, 8, 16, 32, 64 }; /* 仅 ANSI C 支持这种初始化方式(其他可在数组定义之前加关键字 static ) */ // 推荐使用"常量"来指定数组长度并初始化 #define MONTHS 12 int powers[MONTHS] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; // 只读数组则推荐定义为"常量数组", 声明之后不可再赋值! const int days[MONTHS] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
1.未初始化的数组元素、普通变量, 其中存储的是无用的数值;
2.但如果初始化部分数组,未初始化的元素编译器则设置为0;
3.初始化列表项目个数大于数组大小:编译器会报错。可省略掉声明 方括号([])中的长度指定数字,让编译器自动匹配数组大小和初始化项;
4.可使用 sizeof(days)/sizeof(days[0]) 算出"数组的元素数量", 即:数组的元素数量 = 数组总大小/每个元素的大小
初始化指定的项目(C99)
// 传统语法 int arr[6] = { 0, 0, 0, 0, 0, 212 }; // C99规定,在初始化列表中使用带有方括号的元素下标可以指定初始化某个特定的元素: int arr[6] = { [5] = 212 }; // 把 arr[5] 初始化为 212 // 复杂的初始化例子 int days[MONTHS] = { 31, 28, [4] = 31, 30, 31, [1] = 29 }; 输出 days数组内容(12个元素):31, 29, 0, 0, 31, 30, 31, 0, 0, 0, 0, 0
1.初始化指定索引([4])后跟有其他的初始化(无指定索引)值时,这些值会跟着初始化指定索引([4])后的元素
2.初始化可被覆盖
为数组赋值
1.声明数组后,可以通过数组的索引(下标)对数组成员元素进行读写访问。
2.C不支持把数组作为一个整体进行赋值,也不支持用花括号括起来的形式进行赋值(初始化除外)。
#define SIZE 5 int oxen[SIZE] = { 5, 3, 2, 8, 7 }; // 初始化 int yaks[SIZE]; yaks[4] = oxen[0]; // 正确,指定索引(下标)读写 yaks = oxen; // 错误,不支持把数组名作为一个整体进行赋值 yaks[SIZE] = oxen[SIZE]; // 错误,不支持把数组作为一个整体进行赋值 yaks[SIZE] = { 5, 3, 2, 8, 7 }; // 不起作用
数组边界
1.编译器不检查数组边界的索引,可能会出现越界读写!
指定数组大小
int 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 类型指派为 int 类型 float a8[n]; // C99 之前不允许(VAL(variable-length array)可变长数组) float a9[m]; // C99 之前不允许(VAL(variable-length array)可变长数组)
二、多维数组
二维数组的初始化
#define YEARS 5 #define MONTHS 12 // 5 个由 12 个浮点元素(一维数组)组成的二维数组(5行12列)的初始化 float rain[YEARS][MONTHS] = { { 4.3, 4.3, 4.3, 3.0, 2.0, 1.2, 0.2, 0.2, 0.4, 2.4, 3.5, 6.6 }, // 第1年的12个月降雨量 { 8.5, 8.2, 1.2, 1.6, 2.4, 0.0, 5.2, 0.9, 0.3, 0.9, 1.4, 7.3 }, // 第2年的12个月降雨量 { 9.1, 8.5, 6.7, 4.3, 2.1, 0.8, 0.2, 0.2, 1.1, 2.3, 6.1, 8.4 }, // 第3年的12个月降雨量 { 7.2, 9.9, 8.4, 3.3, 1.2, 0.8, 0.4, 0.0, 0.6, 1.7, 4.3, 6.2 }, // 第4年的12个月降雨量 { 7.6, 5.6, 3.8, 2.8, 3.8, 0.2, 0.0, 0.0, 0.0, 1.3, 2.6, 5.2 }, // 第5年的12个月降雨量 };
三、更多维数的数组
二维数组相关的讨论对于三维或甚至更多维数的数组同样适用。
// box 是包含 10 个二维数组(每个二维数组都是:[20行][30列]) int box[10][20][30];
另一种理解方式:box是数组的数组的数组。即:box 是包含 10 个元素的数组, 其中每个元素又是包含 20 个元素的数组, 而这 20 个元素中的每一个又是包含 30 个元素的数组。