数组
数组由数据类型相同的同一系列元素组成
需要使用数组时,通过声明数组告诉编译器数组中内含多少元素和这些元素的类型
普通变量可以使用的类型,数组元素都可以用
float candy[365]; // 内含 365 个 float 类型元素的数组 char code[12]; // 内含 12 个 char 类型元素的数组 int states[50]; // 内含 50 个 int 类型元素的数组
方括号([])表明 candy、code 和 states 都是数组,方括号中的数字表明数组中的元素个数
要访问数组中的元素,通过使用数组下标数(也称为索引)表示数组中的各元素
数组元素的编号从 0 开始,所以 candy[0] 表示 candy 数组的第 1 个元素,candy[364] 表示第 365 个元素,也就是最后一个元素
初始化数组
只储存单个值的变量有时也称为标量变量(scalar variable)
int nums[8] = {1, 2, 3, 4, 5, 6, 7, 8};
用以逗号分隔的值列表(用花括号括起来)来初始化数组,各值之间用逗号分隔,逗号和值之间可以使用空格
根据上面的初始化,把 1 赋给数组的首元素(nums[0]),以此类推
不支持 ANSI 的编辑器会把这种形式的初始化识别为语法错误,在数组声明前加上关键字 static 可以解决此问题
使用 const 声明数组
用 const 声明和初始化数组的话,这个数组就是只读数组,程序在运行过程中不能修改数组中的内容
const int nums[8] = {1, 2, 3, 4, 5, 6, 7, 8};
和普通变量一样,应该使用声明来初始化 const 数据
如果初始化数组失败的话
#include <stdio.h> #define SIZE 4 int main(void) { int no_data[SIZE]; // 未初始化数组 int i; printf("%2s%14s\n", "i", "no_data[i]"); for (i = 0; i < SIZE; i++) printf("%2d%14d\n", i, no_data[i]); return 0; }
运行结果
使用数组前必须先初始化它。与普通变量类似,在使用数组元素之前,必须先给它们赋初值
编译器使用的值是内存相应位置上的现有值,系统不同,输出的结果可能不同
初始化列表中的项数应与数组的大小一致
#include <stdio.h> #define SIZE 4 int main(void) { int some_data[SIZE] = {2, 4}; int i; printf("%2s%14s\n", "i", "some_data[i]"); for (i = 0; i < SIZE; i++) printf("%2d%14d\n", i, some_data[i]); return 0; }
运行结果
当初始化列表中的值少于数组元素个数时,编译器会把剩余的元素都初始化为 0
如果不初始化数组,数组元素和未初始化的普通变量一样,其中储存的都是垃圾值;如果部分初始化数组,剩余的元素就会被初始化为 0