数组是由具有相同类型的数据元素组成的有序调集。数组是由数组名来表明的,数组中的数据由特定的下标来仅有确认。引进数组的意图,是运用一块接连的内存空间存储多个类型相同的数据,以处理一批相关数据的存储问题。数组与一般变量相同,也必须先界说,后运用。数组在C51言语的位置无足轻重,因而深化地了解数组是很有必要的。下面就对数组进行详细的介绍。
(1)一维数组
一维数组是最简略的数组,用来寄存类型相同的数据。数据的寄存是线性接连的。
用以下例程阐明数组的树立、数据操作:
#include
unsigned char array[10];//界说一个有10个单元的数组
void main()
{
unsigned char i;
for(i=0;i<10;i++)
{
array[i]=i; //用下标调用数组中的元素
}
while(1);
}
数组名是用来表明数组的标识,其实它是数组的首地址,即一个指针。不过它所表明的地址是固定的,不能改动。如前几章所述的相关内容,array[2]与*(array+2)是等效的,不过不能用array++,由于array是常量。
上面的程序中的数组是静态树立的,以下例程来用阐明数组的动态树立。
#include
#include
unsigned char *parray;
void main()
{
unsigned char i;
parray=(unsigned char *)malloc(10); //动态创立一个数组
for(i=0;i<10;i++)
{
parray[i]=i; //向数组中赋值
}
free(parray); //开释数组
while(1);
}
字符串是数组的一个重要特例。它的每个单元的数据均为字符类型(char),最终一个单元为(0x00),用来表明字符串的完毕。C51函数库中供给了专门对字符串进行处理的函数,用以下例程阐明:
#include
#include
char s[]={y,a,h,o,o,};
//界说一个字符串,并对它进行初始化,以完毕
void main()
{
char s_temp[10];
strcpy(s_temp,s);//strcpy坐落string.h头文件中,完成字符复制
//s为一个常量,不能s++
strcpy(s_temp,”yahoo”);//与上面的句子等效
while(1);
}
以下列出几种字符串的灵敏用法,期望能够协助读者深化了解字符串:
#include
#include
char *get_sub_string(char *s,unsigned char n)
{
int i;int d=0;int fore=0;
int len=strlen(s);
for(i=0;i< FONT>
{
if(s[i]==,)
{
s[i]=;
d++;
if(d==n)
{
return s+fore;
}
else
{
fore=i+1;
}
}
}
return NULL;
}
void main()
{
unsigned char c;
char string[20];
c=”yahoo”[2]; //c=h
strcpy(string,”123,234,345,456″);
strcpy(string,get_sub_string(string,2));
while(1);
}
(2)二维数组
可由两个下标确认元素的数组就称为二维数组。其界说的一般办法为:
类型阐明符 数组名[常量表达式1][常量表达式2]
例如:int array[6][4];
界说了一个二维数组array,有6行4列,共24个元素。
两个方括号中的常量表达1与常量表达式2规则了数组的行数与列数,然后确认了数组中的元素个数。行下标从0开端,最大为5,共6行;列下标也从0开端,最大为3,共4列。数组中共有6X4=24个元素,详细如下表明:
array[0][0] |
array[0][1] |
array[0][2] |
array[0][3] |
array[1][0] |
array[1][1] |
array[1][2] |
array[1][3] |
array[2][0] |
array[2][1] |
array[2][2] |
array[2][3] |
array[3][0] |
array[3][1] |
array[3][2] |
array[3][3] |
array[4][0] |
array[4][1] |
array[4][2] |
array[4][3] |
array[5][0] |
array[5][1] |
array[5][2] |
array[5][3] |
实践运用时,能够把上述二维数组看作一个6行4列的矩阵,是一个平面的二维结构。那么编译程序是如何用一维的存储空间给这样一个二维结构分配接连的存储单元的呢C51选用按行寄存的办法,即在内存中先寄存第0行元素,再寄存第1行、第2行、……元素,每行中先寄存第0列,接着寄存第1列、第2列、……的元素。
#include
#include
void main()
{
unsigned char arrays[3][3]={{1,2,3},{2,3,4},{3,4,5}};
//界说一个3行3列的二维数组,其它在内存中还是以一维的办法存储的
//用下面的办法就能够知道这一点
unsigned char test;
test=((unsigned char *)arrays)[6];//test=3;
//将二维数据的首地址强制转为一维数组,依照一维数组的办法拜访它
while(1);
}
除了一维数组、二维数组,其实能够界说任何维的数组,多维数组用来表明由多个下标才干决议的量。
例如:int arrays[3][3][3]
表明数组arrays为一个三维数组,对应于三维存储模型。
其实单片机内的存储器是一维的,即一切数据都是顺次次序存储的,所以不管几维数组都由编译程序笼统出数组到单片机存储的实践的一维数组映射。
#include
void main()
{
unsigned char test;
unsigned char arrays[2][2][2]={{{1,2},{2,3}},{{3,4},{4,5}}};
test=arrays[1][1][0];//test=4
test=((unsigned char *)arrays)[7]; //test=5
while(1);
}
(3)结构数组
多个结构变量也能够构成结构数组,其界说办法与界说结构变量完全相同。
如下例:
#include
typedef struct
{
int a,b,c,d;
} Stru;
void main()
{
Stru stru[10]; //界说结构数组
unsigned char i=0;
for(;i<10;i++)
{
stru[i].a=i;
stru[i].b=i;
stru[i].c=i;
stru[i].d=i;
}
while(1);
}