考虑这样一个问题,如果读取5个人的成绩,然后输入它们的平均值呢?
先定义5个整形变量存储5个人的成绩,用scanf()一次输入5格人的成绩,然后对它们进行求和,最后再计算并输出其平均值。
然而,如果学生人数增加到100或更多呢?定义100个变量显然是不现实的。为此,C语言引入数组类型来解决这类需要对相同类型的批量数据进行处理的问题。
数组(Array)是一组具有相同类型的变量的集合,它是一种顺序存储、随机访问的顺序表结构。例如:对上例应用数组可将10个成绩值存储在内存的一个连续区域中,使用一个统一的名字来标识这组相同类型的数据,这个名字称为数组名。构成数组的每个数据项称为数组元素(Element)。c程序通过数组的下标(Subscript)实现对数组元素的访问。
例如,在前面的程序中,可以先定义如下数组来存储5个学生的成绩。
int score[5];
在该声明语句中,int代表该数组的基类型(Base Type),即数组中元素的类型。
下标的个数表明数组的维数(Dimension),本例中下标的个数为1,表明数组socre是一维数组。score后方括号内的数字代表数组元素的个数。因此,该语句通过指定数组元素的类型、名字和元素个数,定义了一个有5个元素的一维int类型数组score。其在内存中的逻辑存储结构是按顺序排放的。
注意:C语言中的数组的下标都是从0开始的。第一个元素的下标值为0,最后一个元素的下标值为4。为了访问数组的每个元素,可以通过数组名加上下标的形式,在数组名的右侧添加方括号,然后将下标值写在其中。例如,再score数组中,第1个元素为score[0],值为90,第2个元素为score[1],值为80,以此类推,第5个元素为score[4],值为95。计算5学生的平均值。
#include <stdio.h>
int main(void)
{
int score[5];
int totalscore = 0;
int i;
for(i=0;i<5;i++)
{
scanf("%d",&score[i]);
totalscore=totalscore+score[i];
}
printf("The average score id %f\n",totalscore/5.0);
return 0;
}
初始化列表中提供的初始值个数不能多余数组元素的个数。若省略对数组长度的声明,
例如:int score[ ]={90,80,70,100,95};
那么,系统会自动按照初始化列表中提供的初值个数对数组进行初始化并确定数组的大小,所以只给部分数组元素赋初值是,对数组的长度声明不能省略。
当数组再所有函数外定义,或用static定义为静态存储类型时,即使不给数组元素赋初值,那么数组元素也会自动初始化为0,这是在编译阶段完成的。
例如:数组下标越界访问的程序示例。
运行程序或单步执行观察变量值的变化情况,我们发现变量a和c的值因数组越界而被悄悄破坏。
#include <stdio.h>
int main(void)
{
int a=1,c=2,b[5]={0},i;
printf("%p,%p,%p\n",b,&c,&a);
for(i=0;i<=8;i++)
{
b[i]=i;
printf("%d %p\n",b[i],&b[i]);
}
printf("\nc= %d, %p a = %d, %p i = %d, %p\n",c,&c,a,&a,i,&i);
}