數(shù)組是由具有相同類型的數(shù)據(jù)元素組成的有序集合,。數(shù)組是由數(shù)組名來表示的,,數(shù)組中的數(shù)據(jù)由特定的下標(biāo)來唯一確定,。引入數(shù)組的目的,,是使用一塊連續(xù)的內(nèi)存空間存儲多個類型相同的數(shù)據(jù),以解決一批相關(guān)數(shù)據(jù)的存儲問題,。數(shù)組與普通變量一樣,,也必須先定義,后使用,。數(shù)組在C51語言的地位舉足輕重,,因此深入地了解數(shù)組是很有必要的。下面就對數(shù)組進(jìn)行詳細(xì)的介紹,。
(1)一維數(shù)組
一維數(shù)組是最簡單的數(shù)組,,用來存放類型相同的數(shù)據(jù)。數(shù)據(jù)的存放是線性連續(xù)的,。
用以下例程說明數(shù)組的建立,、數(shù)據(jù)操作:
#include
/*
-----------------------------------------------------
此程序用以說明數(shù)組的建立、數(shù)據(jù)操作
-----------------------------------------------------
*/
unsigned char array[10];//定義一個有10個單元的數(shù)組
void main()
{
unsigned char i;
for(i=0;i<10;i++)
{
array[i]=i; //用下標(biāo)調(diào)用數(shù)組中的元素
}
/*
---------------------------------------
array |9|8|7|6|5|4|3|2|1|0| [9]~[0]
---------------------------------------
*/
while(1);
}
數(shù)組名是用來表示數(shù)組的標(biāo)識,,其實它是數(shù)組的首地址,,即一個指針。不過它所表示的地址是固定的,,不能改動,。如前幾章所述的相關(guān)內(nèi)容,array[2]與*(array+2)是等效的,,不過不能用array++,,因為array是常量。
上面的程序中的數(shù)組是靜態(tài)建立的,,以下例程來用說明數(shù)組的動態(tài)建立,。
#include
#include
/*
-----------------------------------------------------
此程序用以說明數(shù)組的動態(tài)建立
-----------------------------------------------------
*/
unsigned char *parray;
void main()
{
unsigned char i;
parray=(unsigned char *)malloc(10); //動態(tài)創(chuàng)建一個數(shù)組
for(i=0;i<10;i++)
{
parray[i]=i; //向數(shù)組中賦值
}
free(parray); //釋放數(shù)組
while(1);
}
字符串是數(shù)組的一個重要特例。它的每個單元的數(shù)據(jù)均為字符類型(char),,最后一個單元為''(0x00),,用來表示字符串的結(jié)束。C51函數(shù)庫中提供了專門對字符串進(jìn)行處理的函數(shù),,用以下例程說明:
#include
#include
/*
-----------------------------------------------------
此程序用以說明字符串
-----------------------------------------------------
*/
char s[]={'y','a','h','o','o',''};
//定義一個字符串,,并對它進(jìn)行初始化,以''結(jié)束
void main()
{
char s_temp[10];
strcpy(s_temp,s);//strcpy位于string.h頭文件中,,實現(xiàn)字符拷貝
//s為一個常量,,不能s++
strcpy(s_temp,"yahoo");//與上面的語句等效
while(1);
}以下列出幾種字符串的靈活用法,,希望能夠幫助讀者深入了解字符串:
#include
#include
/*
-----------------------------------------------------
此程序用以說明字符串的靈活運用
-----------------------------------------------------
*/
/*
-----------------------------------------------------
此函數(shù)從字符串s中提取第n個子串,子串間由','分隔
返回指向該子串的指針
-----------------------------------------------------
*/
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
{
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'
/*正如前面所述,,字符串是由字符串的首地址來表示的,,
字符串"yahoo"其實就是它的首地址,那就可以這樣來
取其中的某個字符:"yahoo"[2]*/
strcpy(string,"123,234,345,456");
strcpy(string,get_sub_string(string,2));
while(1);
}
(2)二維數(shù)組
可由兩個下標(biāo)確定元素的數(shù)組就稱為二維數(shù)組,。其定義的一般形式為:
類型說明符 數(shù)組名[常量表達(dá)式1][常量表達(dá)式2]
例如:int array[6][4];
定義了一個二維數(shù)組array,,有6行4列,共24個元素,。
兩個方括號中的常量表達(dá)1與常量表達(dá)式2規(guī)定了數(shù)組的行數(shù)與列數(shù),,從而確定了數(shù)組中的元素個數(shù)。行下標(biāo)從0開始,,最大為5,共6行;列下標(biāo)也從0開始,,最大為3,共4列,。數(shù)組中共有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] |
實際使用時,可以把上述二維數(shù)組看作一個6行4列的矩陣,,是一個平面的二維結(jié)構(gòu),。那么編譯程序是如何用一維的存儲空間給這樣一個二維結(jié)構(gòu)分配連續(xù)的存儲單元的呢C51采用按行存放的方法,即在內(nèi)存中先存放第0行元素,,再存放第1行,、第2行、......元素,,每行中先存放第0列,,接著存放第1列、第2列,、......的元素,。
#include
#include
/*
-----------------------------------------------------
此程序用以說明二維數(shù)組的使用方法
-----------------------------------------------------
*/
void main()
{
unsigned char arrays[3][3]={{1,2,3},{2,3,4},{3,4,5}};
//定義一個3行3列的二維數(shù)組,其它在內(nèi)存中還是以一維的方式存儲的
//用下面的方式就可以知道這一點
unsigned char test;
test=((unsigned char *)arrays)[6];//test=3;
//將二維數(shù)據(jù)的首地址強(qiáng)制轉(zhuǎn)為一維數(shù)組,,按照一維數(shù)組的方式訪問它
while(1);
}
除了一維數(shù)組,、二維數(shù)組,其實可以定義任何維的數(shù)組,,多維數(shù)組用來表示由多個下標(biāo)才能決定的量,。
例如:int arrays[3][3][3]
表示數(shù)組arrays為一個三維數(shù)組,對應(yīng)于三維存儲模型,。
其實單片機(jī)內(nèi)的存儲器是一維的,,即所有數(shù)據(jù)都是依次順序存儲的,所以無論幾維數(shù)組都由編譯程序抽象出數(shù)組到單片機(jī)存儲的實際的一維數(shù)組映射,。
#include
/*
-----------------------------------------------------
此程序用以說明三維數(shù)組
-----------------------------------------------------
*/
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)結(jié)構(gòu)數(shù)組
多個結(jié)構(gòu)變量也可以構(gòu)成結(jié)構(gòu)數(shù)組,,其定義方法與定義結(jié)構(gòu)變量完全相同,。
如下例:
#include
/*
-----------------------------------------------------
此程序用以說明結(jié)構(gòu)數(shù)組
-----------------------------------------------------
*/
typedef struct
{
int a,b,c,d;
} Stru;
void main()
{
Stru stru[10]; //定義結(jié)構(gòu)數(shù)組
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);
}