5.1.2 一维数组

一维数组是指只有一个下标标号的数组。一维数组是一个由若干同类型变量组成的集合,引用这些变量时可用同一数组名。一维数组在存放时占用连续的存储单元,最低地址对应于数组的第一个元素,最高地址对应于数组的最后一个元素。

1.一维数组的定义

在C51中,一维数组的定义形式如下。


类型说明符数组名[常量表达式];


在C51语言中,声明数组时可以对数组进行初始化赋值,其初始化赋值形式如下。


类型说明符数组名[常量表达式]={值,值,……,值};


例如,声明并初始化一维数组。


int a[4]={1,2,3,4}


这里定义了整型数组a[4],包含a[0]、a[1]、a[2]、a[3]共4个元素。数组元素和其值的对应关系,如图5.1所示。

5.1.2 一维数组 - 图1

图 5.1 数组的构成

在程序中使用一维数组时,应注意以下几点。

❑一维数组在本质上是由同类型的数据构成的顺序表结构,示例如下。


int a[6];


假定数组a的起始地址为0xF000,数组a在内存中的存放地址,如表5.1所示。

5.1.2 一维数组 - 图2

❑为了便于编译程序为数组分配内存空间,数组大小必须明确地说明。在C51中,一维数组在内存中所占的总字节数可按下式计算。

总字节数=sizeof(类型)×数组长度

例如,上例中整型数组a[6],其在内存中所占的总字节数为2×6=12字节。

❑在C51中,将一维数组传递给函数时,只需把数组名作为参数即可,而无需指定任何下标。因为C51语言中并不是将整个数组作为实参来传递,而是用指针来代替的。程序示例如下。


include<stdio.h>//头文件

void func(int a[4])//函数,传递数组

{

int i;

for(i=0;i<4;i++)

{

printf(“a[%d]=%d”,i,a[i]);//输出数组

}

}

void main()

{

int i,a[4];

for(i=0;i<4;i++)//数组赋值

{

a[i]=i;

}

func(a);//函数调用,实参是数组名

}


该程序可以在KeilµVision3编译环境中执行,运行的结果如下。


a[0]=0 a[1]=1 a[2]=2 a[3]=3


该程序中,将数组a传递给函数func,即将数组a的首地址a[0]赋给函数,供函数调用。

2.一维数组初始化

一维数组初始化是指在数组定义后,给数组中元素赋初始值。可以采用初始化赋值以及单独赋值两种方式。数组元素初始化赋值的一般形式如下。


类型说明符数组名[常量表达式]={值,值……值};


其中,“{}”中的各值即为对应各元素的初值,各值之间用逗号间隔。示例如下。


int a[10]={0,1,2,3,4,5,6,7,8,9};


该语句为数组a中的各个元素赋值,结果相当即a[0]=0,a[1]=1,……,a[9]=9。在程序中对数组元素进行初始化赋值时,需要注意以下几点。

❑数组初始化赋值是在编译阶段进行的。这样将减少程序运行的时间,提高效率。

❑在C51中,只能给数组元素逐个赋值,不能给数组整体赋值。例如给数组c的10个元素全部赋1值,如下的写法是错误的。


int c[10]=1;


正确的方法如下所示。


int c[10]={1,1,1,1,1,1,1,1,1,1};


❑如果在定义数组时给全部元素赋初始值,则可以省略数组元素的个数。示例如下。


int c[10]={1,1,1,1,1,1,1,1,1,1};


可等价地写为如下所示的形式。


int c[]={1,1,1,1,1,1,1,1,1,1};


❑可以给数组中所有的数组元素赋值,也可以只给部分数组元素赋值。当“{}”中值的个数少于元素个数时,只给数组的从最前面开始的部分元素赋值,此时数组元素个数不能省略。示例如下。


int a[10]={0,1,2,3,4};


本例中,只给前5个元素a[0]~a[4]赋值,而后5个元素自动赋0值。此时应该在方括号中给出数组元素个数,否则数组个数将按5处理。

❑在定义数组时,如果不进行初始化赋值,C51会按默认方式自动处理。对于外部型和静态型数组变量的初始值赋为0,自动型和寄存器型数组变量的初始值赋为随机数。

❑可以在程序执行过程中对数组作动态赋值,此时采用循环语句配合scanf函数,逐个对数组元素进行赋值。程序示例如下。


01:#include<stdio.h>//头文件

02:

03:void main()//主函数

04:{

05:int i,a[5];//定义整型变量i和整型数组a

06:printf(“请输入5个正整数:\n”);//打印说明字符

07:for(i=0;i<5;i++)//循环输入数组a中的元素

08:

{

09:scanf(“%d”,&a[i]);

10:

}

11:for(i=0;i<5;i++)//循环输出数组a中的元素

12:

{

13:printf(“a[%d]=%d”,i,a[i]);

14:

}

15:}


该程序可以在KeilµVision3编译环境中执行。假如键盘输入“1 2 3 4 5”,运行的结果如下。


a[0]=1 a[1]=2 a[2]=3 a[3]=4 a[4]=5


本例中,首先使用scanf语句和for语句,给整型数组a中的5个元素分别赋值。最后用printf语句,逐个输出各数组元素。

技巧C51输入输出函数都是通过串行口工作的,因此,要使用这类函数必须对单片机的串行口进行设置和初始化,如串口模式的选择和波特率的设定等。要在KeilµVision3中编译运行以上程序,可在第5行之后添加以下代码,并在第2行中包含“reg51.h”或“reg52.h”头文件。


SCON=0x50;//CON:工作模式1,8-bit UART,允许接收

TMOD|=0x20;//TMOD:定时器T1,工作模式2,8位自动重载方式,在这里用“|=”是为不影响T0的工作

TH1=0xf3;//当波特率为2400时,定时器初值

TR1=1;//定时器T1开始运行

TI=1;//允许发送数据