在 C语言中我们可以定义如 int、char、float 等多种类型的变量,但是这样的变量当中只能存放一个数据,当我们需要存储大量数据时就显得比较麻烦。比如我们要存储全校 1200 名学生的成绩时,用这种方法就得定义 1200 个变量,这个工作量也太大了。
幸好 C语言给我们提供了“数组”,当需要保存大量数据时就可以利用“数组”来处理。数组可以存储一组具有相同数据类型的值,使它们形成一个小组,可以把它们作为一个整体处理,同时又可以区分小组内的每一个数值。比如一个班 50 名同学的数学成绩,就可以保存在一个数组中,而这 50 名同学的性别又可以保存在另外一个数组中。
同一数组中的所有数据必须是相同数据类型和相同含义的值。比如一个班 50 名同学的数学成绩(浮点型)与性别(字符型)就不能存储在同一个数组中。而 50 名同学的数学成绩(浮点型)和体重(浮点型)虽然它们的数据类型相同,也不能存储在同一个数组中,因为它们所表示的含义不同。
数组实际上是把多个具有相同类型的变量按顺序排列在一起而形成的一个组合(见图 1)。前面我们把变量想象成是单身小房子,那么数组就可以想象成是拥有许多相同小房子的一幢楼。
数组是相同数据类型的变量的排列,因而数组本身也有数据类型,它的数据类型跟组成它的单个变量的数据类型是一样的。为了区分不同的数组,每个数组也需要给它取一个唯一的名字,命名规则跟变量的命名规则是一样的。
数组和普通的变量一样,在 C语言中必须先定义(称作声明数组)才能使用。
数组的声明和变量的定义是一样的,需要指定数据类型,并取一个唯一的名字(数组名),不同之处在于,数组名后紧跟方括号[ ],并且在方括号里面给出该数组所包含元素的总数(也称为数组大小)(代码清单 1)。
代码清单 1:C语言声明数组示例
#include <stdio.h>
int main( )
{
int math[50]; //定义数组 math 存储 50 个数学成绩
char myName[10] = "王小石"; //定义数组 myName 并初始化
char month[ ] = "September"; //定义数组 month 并初始化
int chengJi[4][50]; //定义二维数组存储 50 名学生的四门功课成绩
return 0;
}
数组的元素指的就是数组里面单个的数据。数组实际上是由多个变量排列而成的,因而数组的元素也就是组成数组的单个变量。
在 C语言中,用数组名 [下标]的方式来指定数组中的某个元素,这里的下标指的就是如图 2 中数组 X 当中的元素编号,C语言的元素编号是从 0 开始的自然数序列号。如要获得数组 X 中的数据 100,就可以用 X[1] 来表示,读作“X 下标 1”或“X1”。对数组当中某个数据的获取和使用我们称为数组数据的引用。
比如图 2 中的数组 X,其中:
数组中存储着大量相同类型的关联数据。如果数组只有一行数据,如同在一条直线上排列的许多小房子那样的数组称为一维数组,一维数组用一个下标(元素编号)就可以指定数组元素,比如 X[1] 表示数组 X 中的第 2 个元素。
日常生活中我们常常需要处理如表 1 所示的大量数据。
学科↓ / 学号→ | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | … | 49 | 50 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
语文 | 95 | 56 | 78 | 85 | 85 | 83 | 80 | 85 | 85 | 75 | … | 85 | 85 |
数学 | 80 | 85 | 85 | 75 | 100 | 88 | 100 | 75 | 82 | 83 | … | 82 | 75 |
英语 | 100 | 75 | 82 | 83 | 75 | 85 | 95 | 56 | 78 | 85 | … | 83 | 100 |
科学 | 88 | 68 | 90 | 88 | 68 | 75 | 80 | 85 | 85 | 75 | … | 88 | 90 |
类似这种多行多列的二维表格数据,我们用二维数组来表示。
如果把一维数组比作排列成一排的许多小房子。那么二维数组就是一幢多层楼房,而且每一层都有相同的房间数。这里需要强调的是,每一层的房间数必须是一样的,如果每层的房间数不相同,则不能成为二维数组。
围棋棋盘上黑白棋子位置的管理,以及商品销售量统计表等类似的二维表格数据,都可以使用二维数组(见图 3)。
二维数组用两个下标来指定和引用数组元素,第一个下标表示元素所在的行编号,第二个下标表示元素所在的列编号。在“行”和“列”的交叉处所在的元素就是指定的数组元素。
为了访问二维数组中的某一个特定元素(引用),我们利用数组名和元素行编号与列编号的组合来指定具体的数组元素:
数组名[行编号][列编号]
譬如,把二维数组 ARRAY 中行编号为 2,列编号为 6 的特定数组元素表示为:
ARRAY [2] [6]
C语言中,二维数组的行编号和列编号都是从 0 开始的自然数序列号。因而 ARRAY [2] [6] 中的行编号 2 表示ARRAY数组的第 3 行,列编号 6 表示 ARRAY 数组的第 7 列(见图 4),这样 ARRAY [2] [6] 则为 ARRAY 数组的第 3 行第 7 列交叉位置的数组元素。
在 C语言中,所有数组都可以像变量一样,在声明语句(定义数组)中进行初始化,也就是在数组定义的时候就给数组的各个元素代入数据(值)。但这些代入数组元素的数据(值)必须包含在一对花括号{ }中,而且这些数据(值)只能由常量或常量表达式组成,各个数据(值)之间用逗号,隔开(见代码清单 2)。
代码清单 2:C语言数组初始化代码片段
#include <stdio.h>
int main( )
{
int math[6] = {89,85,90,75,69,95};
int mathAll[ ] = {89,85,90,75,69,95};
char words[5] = {'a','e','i','o','u'};
char month[ ] = "September";
int score[2][3] = {{85,90,95},{65,60,59}};
}
在初始化时,第一个数值被代入下标为 0 的数组元素,第二个数值被代入下标为 1 的数组元素,依此类推,直到所有的数值都被代入。比如对于数组声明:
int math[6] = {89,85,90,75,69,95};
初始化后:math[0] = 89,math[1] = 85,math[2] = 90,math[3] = 75,math[4] = 69,math[5] = 95
同样对于二维数组声明:
int score[2][3] = {{85,90,95},{65,60,59}};
初始化后:score[0][0] = 85,score[0][1] = 90,score[0][2] = 95,score[1][0] = 65,score[1][1] = 60,score[1][2] = 59
图 5 形象地展示了数组元素在定义时的初始化过程。