数组和字符串
为了处理更复杂的数据,C语言还定义了一些功能更强大的复合数据类型,如数组类型、结构体类型、共用体类型和枚举类型。
数组是同一数据类型的许多数据元素按某种顺序排列在一起的集合,通过访问数组名和索引就可以访问数组中的任意元素。
本节将重点学习一下内容:
- 一维数组的使用;
- 具名变量的使用;
- 数组越界的风险;
- 二维数组的使用;
- 多维数组的使用。
8.1 一维数组
一维数组是C语言中用来存储和处理一维序列数据的数据类型。本节将讨论一维数组的定义、数组元素的访问和初始化、数组中各元素地址的表示、数组越界的问题。
8.1.1 定义一维数组
一维数组是用以存储一维数列中数据的集合。数组型变量的定义由4部分组成:数组名、数据类型名、数组操作符和数组容量。
标准定义方式为: 数据类型名 数组名 [数组容量]
举例说明:int array[4]; 上述定义是将变量array定义为存储 4 个 int 型数据的数组。
注意:数组容量必须是常量表达式。
C语言中还允许以下方式在一条语句内定义多个数组变量:int clour[10] , size[5] , shape[9] ; 其中,clour 的数据类型为 int [10]、size 的数据类型为 int [5]、shape 的数据类型为 int [9]。
8.1.2 访问一维数组
通过使用数组名、数组操作符和索引的组合可以访问数组中的任一元素,标准形式 : 数组变量名 [索引]
注意:索引必须为一个整数的表达式;索引的值应大于或等于0,且小于数组容量;数组内元素编号从0开始,直到数组容量的值减1。
8.1.3 初始化一维数组
数组未经初始化会出现不可预期的问题。数组的初始化就是在定义变量的同时给其中的数组元素赋值,有三种形式:
形式一:数据类型 数组名[N] = {值0,值1,值2,…,值(N-1)};
形式二:给部分元素赋值,编译器会自动把剩余元素的内存空间初始化为0
形式三:定义中不给出容量大小,不推荐
8.1.4 数组的存储形式
数组在内存中是作为一个整体分配内存的,数组元素的内存地址都是连续的 ,其差值为数组存储的数据类型的字节长度值。数组变量的值为数组的首地址。
注意事项:使用数组元素时,数组索引超出了正常的范围。 C语言并不检查数组索引是否越界,从而导致数组使用范围外的索引时,能够访问到数组之外的空间,而这些空间有可能是分配给其余变量的。因此,我们要避免数组越界。即使是越界的数组元素,其地址也是按一定规律递增或递减的。
9.1 字符串
字符数组:char 数组名 [数组容量]
字符串常量:包含在一对引号中的字符的集合,可以是句子,也可以是关系表达式。对于任何一个字符串常量,C语言存储其有效的内容的同时,还会在它后面加上一个‘\0’,内存中的空间就会多一个字符。
字符串变量:一维字符数组,使用字符串常量初始化一维数组,便可以得到一个字符串变量。