数组的基本概念第四章已经学过变量的基本类型,比如 char、int 等等。这种类型描述的都是单个具有特定意义的数据,当我们要处理拥有同类意义但是却包含很多个数据的时候,就可以用到数组了,比如我们上节课那个数码管的真值表,就是用一个数组来表达的。

从概念上讲,数组是具有相同数据类型的有序数据的组合,一般来讲,数组定义后满足以下三个条件。

  • 具有相同的数据类型;
  • 具有相同的名字;
  • 在存储器中是被连续存放的。

比如我们上节课定义的那个数码管真值表,如果我们把关键字 code 去掉,数组元素将被保存在 RAM 中,在程序中可读可写,同时我们也可以在中括号里边标明这个数组所包含的元素个数,比如:

  • unsigned char LedChar[16] = {
  •     0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8,
  •     0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E
  • };


在这个数组中的每个值都称之为数组的一个元素,这些元素都具备相同的数据类型就是unsigned char 型,他们有一个共同的名字 LedChar,不管放到 RAM 中还是 FLASH 中,他们都是存放在一块连续的存储空间里的。

有一点要特别注意,这个数组一共有 16(中括号里面的数值)个元素,但是数组的单个元素的表达方式——下标是从 0 开始,因此实际上上边这个数组的首个元素 LedChar[0]的值是 0xC0,而 LedChar[15]的值是 0x8E,下标从 0 到 15 一共是 16 个元素。

LedChar 这个数组只有一个下标,我们称之为一维数组,还有两个下标和多个下标的,我们称之为二维数组和多维数组。比如 unsigned char a[2][3];表示这是一个 2 行 3 列的二维数组。在大多数情况下我们使用的是一维数组,对于初学来说,我们先来研究一维数组,多维数组等遇到了再来了解。数组的声明一维数组的声明格式如下:
    数据类型  数组名 [数组长度];

1) 数组的数据类型声明的是该数组的每个元素的类型,即一个数组中的元素具有相同的数据类型。

2) 数组名的声明要符合 C 语言固定的标识符的声明要求,只能由字母、数字、下划线这三种符号组成,且第一个字符只能是字母或者下划线。

3) 方括号中的数组长度是一个常量或常量表达式,并且必须是正整数。数组的初始化数组在进行声明的同时可以进行初始化操作,格式如下:
    数据类型  数组名 [数组长度] = {初值列表};

还是以上节课我们用的数码管的真值表为例来讲解注意事项。

  • unsigned char LedChar[16] = {
  •     0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8,
  •     0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E
  • };



1) 初值列表里的数据之间要用逗号隔开;

2) 初值列表里的初值的数量必须等于或小于数组长度,当小于数组长度时,数组的后边没有赋初值的元素由系统自动赋值为 0。

3) 若给数组的所有元素都赋初值,那么可以省略数组的长度,上节课的例子中我们实际上已经省略了数组的长度。

4) 系统为数组分配连续的存储单元的时候,数组元素的相对次序由下标来决定,就是说 LedChar[0]、LedChar[1]„„LedChar[15]是按照顺序紧挨着依次排下来的。数组的使用和赋值在 C 语言程序中,是不能一次使用整个数组的,只能使用数组的单个元素。一个数组元素相当于一个变量,使用数组元素的时候与使用相同数据类型的变量的方法是一样的。比如LedChar 这个数组,如果没加 code 关键字,那么它可读可写,我们可以写成 a = LedChar[0]这样来把数组的一个元素的值送个 a 这个变量,也可以写成 LedChar[0] = a 这样把 a 这个变量的值送给数组中的一个元素,以下三点要注意:

  • 引用数组的时候,那个方括号里的数字代表的是数组元素的下标,而数组初始化的时候方括号里的数字代表的是这个数组中元素的总数。
  • 数组元素的方括号里的下标可以是整型常数,整型变量或者表达式,而数组初始化的时候方括号里的数字必须是常数不能是变量。
  • 数组整体赋值只能在初始化的时候进行,程序执行代码中只能对单个元素赋值。




C语言if语句
到目前为止,我们对 if 语句应该已经不陌生了,前边程序已用过多次了,这里我们系统的介绍一下,方便后边的深入学习。if 语句有两个关键字:if 和 else,把这两个关键字翻译一下就是:“如果”和“否则”。if 语句一共有三种格式,我们分别来看。if 语句的默认形式if语句的一般形式如下:
    if (条件表达式){
        语句 1;
    }

其执行过程是,if(即如果)条件表达式的值为“真”,则执行语句 1;如果条件表达式的值为“假”,则不执行语句 1。真和假的概念不再赘述,参考第五章。

这里要提醒大家一点,C 语言一个分号表示一条语句的结束,因此如果 if 后边只有一条执行语句的时候,可以省略大括号,但是如果有多条执行语句的话,必须加上大括号。

那么现在,我们上节课的语句就很好理解了:

  • if (sec >= 16){
  •     sec = 0;
  • }


当 sec 的值大于或等于 16 的时候,括号里的值才是“真”,那么就执行 sec=0 这一句,当 sec 的值小于 16 时,那么括号里就为“假”,就不执行这一句。if...else 语句有些情况下,我们除了要在括号里条件满足时执行相应的语句外,在不满足该条件的时候,也要执行一些另外的语句,这时候就用到了 if...else 语句,它的基本语法形式是:
    if (条件表达式){
        语句 1;
    }else{
        语句 2;
    }
比如上节课的最后一段程序我们也可以写成:

  • P0 = LedChar[sec];
  • if (sec >= 15){
  •     sec = 0;
  • }else{
  •     Sec++;
  • }


这个程序大家可以修改下载到单片机里验证一下,程序逻辑大家自己动脑筋分析,注意条件表达式内 16 到 15 的变化,想一下为什么,我就不多解释了。if....else if 语句if...esle 语句是一个二选一的语句,或者执行 if 分支后的语句,或者执行 else 分支后的语句。还有一种多选一的用法就是 if...else if 语句。他的基本语法格式是:
    if (条件表达式 1){语句 1;}
    else if (条件表达式 2) {语句 2;}
    else if (条件表达式 3) {语句 3;}
    ... ...
    else{语句 n;}

他的执行过程是:依次判断条件表达式的值,当出现某个值为“真”时,则执行相对应的语句,然后跳出整个 if 的语句块,执行“语句 n”后面的程序;如果所有的表达式都为“假”,则执行 else 分支的“语句 n”后,再执行“语句 n”后边的程序。

if 语句在 C 语言编程中使用频率很高,用法也不复杂,所以必须要熟练掌握。

C语言switch语句
用 if....else 语句在处理多分支的时候,分支太多就会显得不方便,且容易出现 if 和 else配对出现错误的情况,在 C 语言中提供了另外一种多分支选择的语句——switch 语句,它的基本语法格式如下:
    switch (表达式){
        case 常量表达式 1: 语句 1;
        case 常量表达式 2: 语句 2;
        ......
        case 常量表达式 n: 语句 n;
        default: 语句 n+1;
    }
它的执行过程是:首先计算“表达式”的值,然后从第一个 case 开始,与“常量表达式x”进行比较,如果与当前常量表达式的值不相等,那么就不执行冒号后边的语句 x,一旦发现和某个常量表达式的值相等了,那么它会执行之后所有的语句,如果直到最后一个“常量表达式 n”都没有找到相等的值,那么就执行 default 后的“语句 n+1”。请特别注意一点,当找到一个相等的 case 分支后,会执行该分支以及之后所有分支的语句,很明显这不是我们想要的结果。

在 C 语言中,有一条 break 语句,作用是跳出当前的循环语句,包括 for 循环和 while 循环,同时,它还能用来结束 switch 语句块。switch 的分支语句一共有 n+1 种,而我们通常希望的都是选择其中的一个分支来执行,执行完后就结束整个 switch 语句,而继续执行 switch后面的语句,此时就可以通过在每个分支后加上 break 语句来实现了。如下:
    switch (表达式){
        case 常量表达式 1: 语句 1; break;
        case 常量表达式 2: 语句 2; break;
        ......
        case 常量表达式 n: 语句 n; break;
        default: 语句 n+1; break;
    }
加了这个 break 语句后,一旦“常量表达式 x”与“表达式”的值相等了,那么就执行“语句 x”,执行完毕后,由于有了 break 则直接跳出 switch 语句,继续执行 switch 语句后面的程序了,这样就可以避免执行不必要的语句。了解了这个 switch 语句后,我们马上会在本章程序中使用巩固它。