数组类型
数组是一组相同类型的数据的集合,数组类型就是所存储元素的类型。数组类型不仅可以是int、float、char等基本类型,也可以是指针以及后续章节将要介绍的结构体类型。
一个指定数据类型的数组,只能存储本数据类型的数据,示例代码如下:
int arr1[5] = { 1,2,3,4,5 }; //定义int类型数组,元素为1、2、3、4、5
char arr2[5] = { 'a','b' }; //定义char类型数组,元素为'a'、'b'
float arr3[5] = { 1.2,3.6,9.9 };//定义float类型的数组,元素为1.2、3.6、9.9
上述代码中,数组arr1的类型为int,存储的元素均为int类型;数组arr2的类型为char,存储的元素均为char类型;数组arr3的类型为float,存储的元素均为float类型。
如果在数组中存储不同类型的数据,编译器并不会报错,它会将数据转换为与数组类型相同的数据再存储到数组中。例如,将上述代码中数组arr1的元素1更改为10.8,示例代码如下:
arr1[0] = 10.8; //将arr1[0]位置上的元素更改为10.8
在上述代码中,10.8为浮点类型数据,将其存储在int类型的数组中,编译器会将10.8转换为int类型的10,再存储到数组arr1中,当用户读取arr1[0]位置的值时,其值为10。
对于char、float等其他类型的数组,当存储的数据类型不符合规则时,编译器会根据编译规则进行适当转换,保证数组中存储的数据都是相同类型。如果不能完成转换,编译器就会报错,例如,向float类型数组中存储整型数据,编译器会将数据转换为float类型再存储到数组中;如果向float类型数组中存储字符型数据,编译器会将字符对应的ASCII编码转换为float类型数据,再存储到数组中。
对于字符类型数组,如果向其中存储int类型数据,编译器会将其视为ASCII编码;如果存储float类型数据,编译器会将其转换为int类型数据,再将其视为ASCII编码。需要注意的是,如果存储的int类型数据或float类型数据超出了ASCII码表范围,编译器无法正确解读转换,用户在读取数组中元素时就无法得到预期结果。
此外,字符类型数组如果存储了字符串,编译器会将字符串拆解成单个字符存储到字符数组中,且拆解字符串时最后会拆解出一个'\0'字符。例如,有char类型的数组carr,定义如下:
char carr[5] = { 'a','b',"sf" }; //char类型数组中存储了一个字符串
在数组carr中,存储了两个字符和一个包含两个字符的字符串,在定义数组时,编译器会将字符串"sf"拆分成字符's'、'f'和'\0'存储在数组中,其形式如图1所示。
图1 字符数组carr的存储形式
在图1中,同样可以通过索引访问字符数组carr中的各个字符,包括拆分后的's'、'f'、'\0'字符。