6.11 数组简介
数组可以作为一种存储多个相关项的遍历方式。
数组(array)是按顺序存储的一系列类型相同的值。整个数组有一个数组名,通过整数下标访问数组中单独的项或元素(element)。
注意,数组元素的编号从0开始,不是从1开始。
实际上,使用数组元素和使用同类型的变量一样。
注意一个潜在的陷阱:考虑到执行速度的影响,C编译器不会检查数组的下标是否正确。
当下标超过数组有效范围外,当运行程序时,这会导致数据被放置在已被其他数据占用的地方,可能会破坏程序的结果甚至导致程序异常中断。
数组的类型可以是任意数据类型。
如果char类型的数组末尾包含一个表示字符串末尾的空字符\0,则该数组中的内容就构成了一个字符串,否则就是字符数组。
用于识别数组元素的数组被称为下标(subscript)、索引(indice)或偏移量(offset)。下标必须是整数,而且要从0开始计数。
数组的元素被依次存储在内存中相邻的位置。
6.11.1 在for循环中使用数组
程序打印总分、平均分、差点(handicap),它是平均分与标准分的差值。
// scores_in.c -- uses loops for array processing
#include
#define SIZE 10
#define PAR 72
int main(void)
{
int index, score[SIZE];
int sum = 0;
float average;
printf("Enter %d golf scores:\n", SIZE);
for (index = 0; index < SIZE; index++)
scanf("%d", &score[index]); // read in the ten scores
printf("The scores read in are as follows:\n");
for (index = 0; index < SIZE; index++)
printf("%5d", score[index]); // verify input
printf("\n");
for (index = 0; index < SIZE; index++)
sum += score[index]; // add them up
average = (float) sum / SIZE; // time-honored method
printf("Sum of scores = %d, average = %.2f\n", sum, average);
printf("That's a handicap of %.0f.\n", average - PAR);
return 0;
}
/* 输出:
*/
scanf()会跳过空白字符。所以可以在一行输入10个数字,也可以每行只输入一个数字,或者像本例这样混合使用空格和换行符隔开每个数字(因为输入是缓冲的,只用当用户键入Enter键后数字才会被发送给程序)。
一些较好的程序风格:
第一,用#define指令创建的明示常量来指定数组的大小。这样就可以在定义数组和设置循环边界时使用该明示常量。如果以后要扩展数组的大小,只需要修改SIZE即可,不用逐一修改程序中使用了数组大小的每一处。
第二,可以很方便地处理一个大小为SIZE的数组:
for( index = 0; index < SIZE; index++ )
设置正确的数组边界很重要。第1个元素的下标是0,最后一个元素的下标是SIZE - 1。因此使用index < SIZE。
第三,程序能重复显示刚读入的数据。这是很好的编程习惯,有助于确保程序处理的数据与期望相符。
for( index = 0; index < SIZE; index++ ){
scanf("%d", &score[index]); // read in the ten scores
printf("%5d", score[index]); // verify input
sum += score[index]; // add them up
}
该程序可以合并3个独立的for循环。合并后的程序显得更加紧凑。但是,调整时要注意遵循模块化(modularity)的原则。模块化隐含的思想是:应该把程序划分为一些独立的单元,每个单元执行一个任务。这样做提高了程序的可读性。也许更重要的是,模块化使程序的不同部分彼此独立,方便后续更新或修改程序。在掌握如何使用函数后,可以把每个执行任务的单元放进函数中,提高程序的模块化。