看了上面的例子,你也許有一個(gè)地方想不通,那就是為什么枚舉值不用貶值就能使 用?那是因?yàn)樵诿杜e列表中,每一項(xiàng)名稱(chēng)代表一個(gè)整數(shù)值,在默認(rèn)的情況下,編譯器會(huì)自動(dòng) 為每一項(xiàng)賦值,第一項(xiàng)賦值為 0,第二項(xiàng)為 1…...如 Week 中的 Sun 為 0,F(xiàn)ri 為 5。C 語(yǔ)言也 允許對(duì)各項(xiàng)值做初始化賦值,要注意的是在對(duì)某項(xiàng)值初始化后,它的后續(xù)的各項(xiàng)值也隨之遞 增。如:
enum Week {Mon=1, Tue, Wed, Thu, Fri, Sat, Sun};
上例的枚舉就使 Week 值從 1 到 7,這樣會(huì)更符合我們的習(xí)慣。使用枚舉就如變量一樣, 但在程序中不能為其賦值。
聯(lián)合
聯(lián)合同樣是 C 語(yǔ)言中的構(gòu)造類(lèi)型的數(shù)據(jù)結(jié)構(gòu)。它和結(jié)構(gòu)類(lèi)型一樣能包含不一樣類(lèi)型的 數(shù)據(jù)元素,所不一樣的是聯(lián)合的數(shù)據(jù)元素都是從同一個(gè)數(shù)據(jù)地址開(kāi)始存放。結(jié)構(gòu)變量占用的內(nèi) 存大小是該結(jié)構(gòu)中數(shù)據(jù)元素所占內(nèi)存數(shù)的總和,而聯(lián)合變量所占用內(nèi)存大小只是該聯(lián)合中最 長(zhǎng)的元素所占用的內(nèi)存大小。如在結(jié)構(gòu)中定義了一個(gè) int 和一個(gè) char,那么結(jié)構(gòu)變量就會(huì)占
用 3 個(gè)字節(jié)的內(nèi)存,而在聯(lián)合中同樣定義一個(gè) int 和一個(gè) char,聯(lián)合變量只會(huì)占用 2 個(gè)字節(jié)。 這種能充分利用內(nèi)存空間的技術(shù)叫‘內(nèi)存覆蓋技術(shù)’,它能使不一樣的變量分時(shí)的使用同一 個(gè)內(nèi)存空間。使用聯(lián)合變量時(shí)要注意它的數(shù)據(jù)元素只能是分時(shí)使用,而不能同時(shí)使用。舉個(gè) 簡(jiǎn)單的例子,程序先為聯(lián)合中的 int 賦值 1000,后來(lái)又為 char 賦值 10,那么這個(gè)時(shí)候就不能引用
int 了,不然程序會(huì)出錯(cuò),起作用的是最后一次賦值的元素,而上一次賦值的元素就失效了。 使用中還要注意定義聯(lián)合變量時(shí)不能對(duì)它的值初始化、能使用指向聯(lián)合變量的指針對(duì)其操 作、聯(lián)合變量不能作為函數(shù)的參數(shù)進(jìn)行傳遞,數(shù)組和結(jié)構(gòu)能出現(xiàn)在聯(lián)合中。
聯(lián)合類(lèi)型變量的定義方法和結(jié)構(gòu)的定義方法差不多,只要把關(guān)鍵字 struct 換用 union 就 能了。聯(lián)合變量的引用方法除也是使用‘.’成員運(yùn)算符。
下面就用一個(gè)綜合的例子說(shuō)明三種類(lèi)型的簡(jiǎn)單使用。
#include
#include
void main(void)
{
enum TF {
False, True} State; //定義一個(gè)枚舉,使程序更易讀
union File { //聯(lián)合中包含一數(shù)組和結(jié)構(gòu),
unsigned char Str[11]; //整個(gè)聯(lián)合共用 11 個(gè)字節(jié)內(nèi)存
struct FN {
unsigned char Name[6],EName[5];} FileName;
} MyFile;
unsigned char Temp;
SCON = 0x50; //串行口方式 1,允許接收
TMOD = 0x20; //定時(shí)器 1 定時(shí)方式 2
TCON = 0x40; //設(shè)定時(shí)器 1 開(kāi)始計(jì)數(shù)
TH1 = 0xE8; //11.0592MHz 1200 波特率
TL1 = 0xE8; TI = 1;
TR1 = 1; //啟動(dòng)定時(shí)器
State = True; //這里演示 State 只能賦為 False,True 兩個(gè)值,其它無(wú)效
//State = 3;這樣是錯(cuò)誤的
printf ("Input File Name 5Byte: \n");
scanf("%s", MyFile.FileName.Name); //保存 5 字節(jié)字符串要 6 個(gè)字節(jié)
printf ("Input File ExtendName 4Byte: \n");
scanf("%s", MyFile.FileName.EName);
if (State == True)
{
printf ("File Name : ");
for (Temp=0; Temp<12; Temp++)
printf ("%c", MyFile.Str[Temp]); //這里列出所有的字節(jié)
printf ("\n Name :");
printf ("%s", MyFile.FileName.Name);
printf ("\n ExtendName :");
printf ("%s", MyFile.FileName.EName);
}
while(1);
}
圖 17-1 所示是運(yùn)行的結(jié)果,A 中所示是說(shuō)明例程中聯(lián)合中的數(shù)組和結(jié)構(gòu)占用的是同一段地址的內(nèi)存空間,而結(jié)構(gòu)中的兩數(shù)組是各占兩段不一樣內(nèi)存空間。

圖 17-1
在此簡(jiǎn)單的單片機(jī)C語(yǔ)言教程就結(jié)束了,限于作者的水平不能詳盡書(shū)寫(xiě)。作者本人也是 一名業(yè)余的單片機(jī)愛(ài)好者,希望能和更多相同興趣的朋友學(xué)習(xí)交流,讀者朋友也能訪問(wèn)網(wǎng)站 或電郵 51hei@163.com,得到本文相關(guān)的更多資訊。本教程所涉及c51源代碼請(qǐng)點(diǎn)此下載
電子發(fā)燒友App





















評(píng)論