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 数组的构成
在程序中使用一维数组时,应注意以下几点。
❑一维数组在本质上是由同类型的数据构成的顺序表结构,示例如下。
int a[6];
假定数组a的起始地址为0xF000,数组a在内存中的存放地址,如表5.1所示。
❑为了便于编译程序为数组分配内存空间,数组大小必须明确地说明。在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;//允许发送数据