还记得我们在 C 语言一开始学过的变量吗?
在程序设计中,变量是指一个包含部分已知或未知数值的储存空间,以及相对应的符号名称(变量名)
Wikipedia
看一小段有关变量的代码:
#include <stdio.h>
int main() {
int i;
scanf("%d", &i);
printf("%d", i);
}
这段代码非常的简单,它做了这样三件事:
我们很容易的定义了一个变量,并对它进行赋值。
比如这个变量表示一本书的页数,那么我们就完成的页数的输入和输出。
但是如果不只有一本书,而是有数学、语文、英语三本书,怎么做呢?
似乎也不难,看下代码:
#include <stdio.h>
int main() {
int math, chinese, english;
scanf("%d %d %d", &math, &chinese, &english);
printf("%d %d %d", math, chinese, english);
}
这也并不难,三本书的页数都做到了输入和输出。
现在,新的问题又来了,不只有几本书了,我们要求输入一整个图书馆的所有书的页数...
图书馆的书有上万本
天呐,不会要定义几万个变量吧!
当然不用了,不然,定义完变量都地老天荒了~
我们来看一个聪明的解决方案 —— 数组。
什么是数组 array?
在计算机科学中,阵列资料结构(英语:array data structure),简称数组(英语:Array)。
数组是由相同类型的元素(element)的集合所组成的资料结构,分配一块连续的内存来存储。
Wikipedia
当我们有大量的数据需要存储时,数组就派上了用场。
数组里通常保存同一类型的许多数据,并可以进行快速的赋值和快速的输出。
数组是一种非常重要的数据结构,学好用好数组对于我们进一步学习算法至关重要。
在计算机科学中,数据结构(英语:data structure)是计算机中存储、组织数据的方式。
Wikipedia
数组也是所有高级计算机语言都具有的一种数据存储方式。
那么,具体到了 C 语言,数组是怎样使用的呢?
我们现在开始学习数组的使用,按照以下的四个方面:
在 C 语言中,定义数组只需要一行代码:
int main() {
// 声明一个数组
int numbers[10];
}
对,就是这样,我们就声明的一个数组。
什么含义呢?
数组 numbers 中存放 10 个 int 类型的数据。
数组存放数据的示意
这 10 个数据在计算机的内存中是连续存放的,其中的每一个数据我们称之为这个数组的元素 element。
每一个数组的元素还有一个序号,我们称之为索引 index,索引是从 0 开始的,numbers[0] 就代表这个数组的一个元素。
数组的赋值数组中的每一个元素都相当于一个变量,有了元素的概念,数组的赋值就很简单了:
int main() {
int numbers[10];
// 为数组元素赋值
numbers[0] = 123;
}
这样就为数组的一个元素赋值为 123。
数组的输出当我们为元素赋值以后,就可以输出这个元素的值了:
#include <stdio.h>
int main() {
int numbers[10];
numbers[0] = 123;
// 输出第一个元素的值
printf("%d", numbers[0]);
}
此外,如果我们需要快速输出一个数组所有元素的值,还可以利用我们学过的循环语句来实现:
#include <stdio.h>
int numbers[10];
int main() {
// 循环输出数组的每个元素
for (int i = 0; i < 10; i++) {
printf("%d ", numbers[i]);
}
}
非常快的速度,10 个数字就完成了输出。
注意的问题在使用数组时,我们需要注意一个问题,看下面这个例子:
#include <stdio.h>
int numbers[10];
int main() {
printf("%d", numbers[10]);
}
这段程序是可以执行的,但是却存在一个不太容易发现的逻辑问题。
注意到数组 numbers 只有 10 个元素,而索引是起始于 0,所以,这个数组的元素只能是 numbers[0] 到 numbers[9],numbers[10] 已经超出了索引的界限。
这是在数组使用时非常容易产生的一个错误,需要小心避免。
在上面我们讲的数组都是一维数组,就是说,数组的元素排列起来像一条线:
排成一列的兵人
而语言中,还有多维数组的存在,比如常用的二维数组。
如果说一维数组是一条线,那么二维数组就是一个面:
有行有列的二维数组
在 C 语言当中,二维数组的定义是这样的:
int main() {
// 二维数组的定义
int matrix[1024][768];
}
可以把二维数组理解为一个关于一维数组的一维数组,是不是有点绕?
关于二维数组的使用,就作为我们今天的课后思考题吧~