C 语言支持数组数据结构,它可以存储一个固定大小的相同类型元素的顺序集合。

数组是用来存储一系列数据,但它往往被认为是一系列相同类型的变量。

数组名

几乎在所有使用数组名的表达式中,数组名的值是一个指针常量,也就是数组第一个元素的地址,它的类型取决于数组元素的类型,如果它们是int型,那么数组名的类型就是“指向in它的常量指针”。

但是数组名和指针并不是相同的,数组具有一些和指针完全不同的特征,例如:数组具有确定的元素个数,而指针只是一个标量值。

只有当数组名在表达式中使用时,编译器才会产生一个指针值。注意这个值是一个指针常量,而不是指针变量,不能修改常量的值。指针常量所指向的是内存中数组的起始位置,如果修改这个指针常量,唯一可行的操作就是把整个数组移动到内存的其它位置。但是在程序链接完成之后,内存中数组的位置是固定的,所以当程序运行时,再想移动数组就为时已晚,因此数组名的值是一个指针常量。

只有在两种情况下,数组名不用指针常量来表示:

数组名作为sizeof操作符的操作数;sizeof返回整个数组的长度,而不是指向数组指针的长度。

数组名作为&操作符的操作数,取一个数组名的地址所产生的是一个指向数组的指针,而不是一个指向某个指针常量的指针。

下标引用

数组元素是组成数组的基本单元。数组元素也是一种变量, 其标识方法为数组名后跟一个下标。下标表示了元素在数组中的顺序号。数组元素的一般形式为:
数组名[下标]

所有的数组都是以 0 作为它们第一个元素的索引,也被称为基索引,数组的最后一个索引是数组的总大小减去 1。

数组元素通常也称为下标变量。必须先定义数组,才能使用下标变量。在C语言中只能逐个地使用下标变量,而不能一次引用整个数组。

下标表达式array [value]和间接访问表达式*(array+(value))是一样的,因此,下表不仅可用于数组名,也可以用于指针表达式,不过如此一来,编译器就很难检查下标的有效性,指针表达式可能比下标表达式效率更高,但是下标表达式不可能比指针表达式效率更高。但有时候牺牲程序的可维护性提高运行时效率也未必是好的主意。