信奥竞赛

系列

剑指信奥 | C 语言之兵人来袭!

当变量急剧增长

还记得我们在 C 语言一开始学过的变量吗?

在程序设计中,变量是指一个包含部分已知或未知数值的储存空间,以及相对应的符号名称(变量名)

Wikipedia

看一小段有关变量的代码:

#include <stdio.h>
int main() {
    int i;
    scanf("%d", &i);
    printf("%d", i);
}
                

这段代码非常的简单,它做了这样三件事:

  1. 声明一个变量 i
  2. 输入一个值给 i
  3. 再次输出 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];
}
                

可以把二维数组理解为一个关于一维数组的一维数组,是不是有点绕?

关于二维数组的使用,就作为我们今天的课后思考题吧~

日积月累

  • array 数组
  • element 元素
  • index 索引