(1)一維數組
本文引用地址:http://www.eepw.com.cn/article/201611/320327.htm一維數組是最簡單的數組,用來存放類型相同的數據。數據的存放是線性連續的。
用以下例程說明數組的建立、數據操作:
#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);
}