(玩電(dian)子) 電(dian)子技術學習與研(yan)xin)/div>
當前位置︰單片機教程網 >> 基礎(chu)教程 >> 瀏覽文章

500万彩票官网

作者:佚名   來源:本站原(yuan)創   點擊(ji)數:x  更新時(shi)間︰2007年07月(yue)12日   【字體(ti)︰

前面的(de)文章中介紹了 C  語言的(de)基本數據類型,為(wei)了更有效的(de)處理更復雜的(de)數據,C  語 言引入(ru)了構(gou)造類型的(de)數據類型。構(gou)造類型就是將一批各(ge)種類型的(de)數據放在(zai)一起形成一種特殊(shu) 類型的(de)數據。之前討論(lun)過的(de)數組(zu)也算是一種構(gou)造類型的(de)數據,單片機c語言 中的(de)構(gou)造類型還(huai)有結構(gou)、 枚(mei)舉和聯(lian)合。

結構(gou)

結構(gou)是一種數據的(de)集合體(ti),它能按需(xu)要將不一樣類型的(de)變量組(zu)合在(zai)一起,整個集合體(ti)用 一個結構(gou)變量名表示,組(zu)成這個集合體(ti)的(de)各(ge)個變量稱為(wei)結構(gou)成員。理解結構(gou)的(de)概念,能用 班(ban)級和學生的(de)關系deng)?斫狻0ban)級名稱就相當于結構(gou)變量名,它代表所(suo)有同(tong)學的(de)集合,而每個 同(tong)學就是這個結構(gou)中的(de)成員。使用結構(gou)變量時(shi),要先(xian)定義結構(gou)類型。一般定義格式如下︰

struct  結構(gou)名  {結構(gou)元(yuan)素表};

例子︰struct    FileInfo

{

unsigned char FileName[4]; unsigned long Date; unsigned int Size;

}

上面的(de)例子中定義了一個簡(jian)單的(de)文件(jian)信息(xi)結構(gou)類型,它可(ke)用于定義用于簡(jian)單的(de)單片機文 件(jian)信息(xi),結構(gou)中有三個元(yuan)素,分(fen)別用于操作文件(jian)名、日期(qi)、大小。因為(wei)結構(gou)中的(de)每個數據成 員能使用不一樣的(de)數據類型,所(suo)以要對每個數據成員進(jin)行數據類型定義。定義好(hao)一個結構(gou)類 型後(hou),能按下面的(de)格式進(jin)行定義結構(gou)變量,要注意的(de)是只(zhi)有結構(gou)變量才(cai)能參與程序的(de)執 行,結構(gou)類型只(zhi)是用于說明結構(gou)變量是屬于那一種結構(gou)。

struct  結構(gou)名  結構(gou)變量名 1,結構(gou)變量名 2……結構(gou)變量 N; 例子︰struct FileInfo NewFileInfo, OleFileInfo;

通過上面的(de)定義 NewFileInfo 和 OleFileInfo 都是 FileInfo 結構(gou),都具(ju)有一個字符型數組(zu) 一個長(chang)整型和一個整形數據。定義結構(gou)類型只(zhi)是給出了這個結構(gou)的(de)組(zu)織形式,它不會佔用存 儲空(kong)間,也就說結構(gou)名是不能進(jin)行賦值(zhi)和運算等(deng)操作的(de)。結構(gou)變量則(ze)是結構(gou)中的(de)具(ju)體(ti)成員, 會佔用空(kong)間,能對每個成員進(jin)行操作。

結構(gou)是允許嵌套的(de),也就是說在(zai)定義結構(gou)類型時(shi),結構(gou)的(de)元(yuan)素能由另一個結構(gou)構(gou)成。 如︰

struct clock

{

unsigned char sec, min, hour;

}

struct date

{

unsigned int year;

unsigned char month, day;

struct clock Time; //這是結構(gou)嵌套

}

struct date NowDate; //定義 data 結構(gou)變量名為(wei) NowDate


 

開始學習的(de)朋友看(kan)到這可(ke)能會發問︰“各(ge)個數據元(yuan)素要如何引用、賦值(zhi)呢?”使用結構(gou)變量 時(shi)是通過對它的(de)結構(gou)元(yuan)素的(de)引用來實現zhi)摹R玫de)方法(fa)是使用存取結構(gou)元(yuan)素成員運算符“.” 來連接結構(gou)名和元(yuan)素名,格式如下︰

結構(gou)變量名.結構(gou)元(yuan)素

要存取上例結構(gou)變量中的(de)月(yue)份時(shi),就要寫(xie)成  NowDate..year。而嵌套的(de)結構(gou),在(zai)引用元(yuan) 素時(shi)就要使用mei)喔齔稍痹慫惴 患兌患讀 擁階畹圖兜de)結構(gou)元(yuan)素。要注意的(de)是在(zai)  單片機c語言  中 只(zhi)能對最低級的(de)結構(gou)元(yuan)素進(jin)行訪問,而不可(ke)能對整個結構(gou)進(jin)行操作。操作例子︰

NowDate.year = 2005;

NowDate.month = OleMonth+ 2; //月(yue)份數據在(zai)舊的(de)基礎(chu)上加 2

NowDate.Time.min++; //分(fen)針加 1,嵌套時(shi)只(zhi)能引用最低一級元(yuan)素 一個結構(gou)變量中元(yuan)素的(de)名字能和程序中其他地(di)方使用的(de)變量同(tong)名,因為(wei)元(yuan)素是屬于它所(suo)在(zai) 的(de)結構(gou)中,使用時(shi)要用成員運算符指(zhi)定。

結構(gou)類型的(de)定義還(huai)能有如下的(de)兩種zhi)袷健/p>

struct

{

結構(gou)元(yuan)素表

}  結構(gou)變量名 1,結構(gou)變量名 2……結構(gou)變量名 N;

例︰struct

{

unsigned char FileName[4]; unsigned long Date; unsigned int Size;

} NewFileInfo, OleFileInfo;

這一種定義方式定義沒有使用結構(gou)名,稱為(wei)無名結構(gou)。通常會用于程序中只(zhi)有幾個確定 的(de)結構(gou)變量的(de)場合,不能在(zai)其它結構(gou)中嵌套。

另一種定義方式如下︰

struct  結構(gou)名

{

結構(gou)元(yuan)素表

}  結構(gou)變量名 1,結構(gou)變量名 2……結構(gou)變量名 N;

例︰struct FileInfo

{

unsigned char FileName[4]; unsigned long Date; unsigned int Size;

} NewFileInfo, OleFileInfo;

使用結構(gou)名能便于閱讀程序和便于以後(hou)要在(zai)定義其它結構(gou)中使用。 枚(mei)舉

在(zai)程序中xin) R 玫揭恍xie)變量去做程序中的(de)判(pan)斷標志jin)H緹 R 靡桓鱟址蛘捅淞/p>

去儲存 1 和 0 做判(pan)斷條件(jian)真假的(de)標志,但我們也許會疏(shu)忽這個變量只(zhi)有當等(deng)于 0 或 1 才(cai)是有


 

效的(de),而將它賦上別的(de)值(zhi),而使程序出錯或變的(de)混亂。這個時(shi)候能使用枚(mei)舉數據類型去定義變 量,限制錯誤賦值(zhi)。枚(mei)舉數據類型就是把某些(xie)整型常量的(de)集合用一個名字表示,其中的(de)整型 常量就是這種枚(mei)舉類型變量的(de)可(ke)取的(de)合法(fa)值(zhi)。枚(mei)舉類型的(de)二種定義格式如下︰

enum  枚(mei)舉名  {枚(mei)舉值(zhi)列表}  變量列表;

例  enum TFFlag {False, True} TFF;

enum  枚(mei)舉名  {枚(mei)舉值(zhi)列表};

emum  枚(mei)舉名  變量列表;

例    enum Week {Sun, Mon, Tue, Wed, Thu, Fri, Sat};

enum Week OldWeek, NewWeek;

看(kan)了上面的(de)例子,你也許有一個地(di)方想(xiang)不通,那就是為(wei)什麼枚(mei)舉值(zhi)不用貶值(zhi)就能使 用?那是因為(wei)在(zai)枚(mei)舉列表中,每一項名稱代表一個整數值(zhi),在(zai)默(mo)認的(de)情況下,編譯(yi)器(qi)會自動 為(wei)每一項賦值(zhi),第(di)一項賦值(zhi)為(wei) 0,第(di)二項為(wei) 1…...如 Week 中的(de) Sun 為(wei) 0,Fri 為(wei) 5。C 語言也 允許對各(ge)項值(zhi)做初始化賦值(zhi),要注意的(de)是在(zai)對某項值(zhi)初始化後(hou),它的(de)後(hou)續(xu)的(de)各(ge)項值(zhi)也隨之遞 增(zeng)。如︰

enum Week {Mon=1, Tue, Wed, Thu, Fri, Sat, Sun};

上例的(de)枚(mei)舉就使 Week 值(zhi)從 1 到 7,這樣會更符合我們的(de)習慣(guan)。使用枚(mei)舉就如變量一樣, 但在(zai)程序中不能為(wei)其賦值(zhi)。

聯(lian)合

聯(lian)合同(tong)樣是  C  語言中的(de)構(gou)造類型的(de)數據結構(gou)。它和結構(gou)類型一樣能包含不一樣類型的(de) 數據元(yuan)素,所(suo)不一樣的(de)是聯(lian)合的(de)數據元(yuan)素都是從同(tong)一個數據地(di)址開始存放。結構(gou)變量kong)加玫de)內(na) 存大小是該(gai)結構(gou)中數據元(yuan)素所(suo)佔內(na)存數的(de)總和,而聯(lian)合變量所(suo)佔用內(na)存大小只(zhi)是該(gai)聯(lian)合中最 長(chang)的(de)元(yuan)素所(suo)佔用的(de)內(na)存大小。如在(zai)結構(gou)中定義了一個 int 和一個 char,那麼結構(gou)變量就會佔

用 3 個字節的(de)內(na)存,而在(zai)聯(lian)合中同(tong)樣定義一個 int 和一個 char,聯(lian)合變量只(zhi)會佔用 2 個字節。 這種能充(chong)分(fen)利用內(na)存空(kong)間的(de)技術叫‘內(na)存覆蓋技術’,它能使gong)灰謊de)變量分(fen)時(shi)的(de)使用同(tong)一 個內(na)存空(kong)間。使用聯(lian)合變量時(shi)要注意它的(de)數據元(yuan)素只(zhi)能是分(fen)時(shi)使用,而不能同(tong)時(shi)使用。舉個 簡(jian)單的(de)例子,程序先(xian)為(wei)聯(lian)合中的(de) int 賦值(zhi) 1000,後(hou)來又為(wei) char 賦值(zhi) 10,那麼這個時(shi)候就不能引用

int 了,不然(ran)程序會出錯,起作用的(de)是最後(hou)一次賦值(zhi)的(de)元(yuan)素,而上一次賦值(zhi)的(de)元(yuan)素就失效了。 使用中還(huai)要注意定義聯(lian)合變量時(shi)不能對它的(de)值(zhi)初始化、能使用指(zhi)向聯(lian)合變量的(de)指(zhi)針對其操 作、聯(lian)合變量不能作為(wei)函數的(de)參數進(jin)行xie) 藎 zu)和結構(gou)能出現在(zai)聯(lian)合中。

聯(lian)合類型變量的(de)定義方法(fa)和結構(gou)的(de)定義方法(fa)差不多,只(zhi)要把關鍵字 struct 換用 union 就 能了。聯(lian)合變量的(de)引用方法(fa)除也是使用‘.’成員運算符。

下面就用一個綜合的(de)例子說明三種類型的(de)簡(jian)單使用。

#include <AT89X51.H>

#include <stdio.h>

void main(void)

{

enum TF {

False, True} State; //定義一個枚(mei)舉,使程序更易讀

union File { //聯(lian)合中包含一數組(zu)和結構(gou),


 

unsigned char Str[11]; //整個聯(lian)合共(gong)用 11 個字節內(na)存

struct FN {

unsigned char Name[6],EName[5];} FileName;

} MyFile;

unsigned char Temp;

SCON = 0x50; //串行口方式 1,允許接收

TMOD = 0x20; //定時(shi)器(qi) 1 定時(shi)方式 2

TCON = 0x40; //設定時(shi)器(qi) 1 開始計數

TH1 = 0xE8;   //11.0592MHz 1200 波特率

TL1 = 0xE8; TI = 1;

TR1 = 1; //啟(qi)動定時(shi)器(qi)

State = True; //這里演(yan)示 State 只(zhi)能賦為(wei) False,True 兩個值(zhi),其它無效

//State = 3;這樣是錯誤的(de)

printf ("Input File Name 5Byte: \n");

scanf("%s", MyFile.FileName.Name); //保存 5 字節字符串要 6 個字節

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]); //這里列出所(suo)有的(de)字節

printf ("\n    Name :");

printf ("%s", MyFile.FileName.Name);

printf ("\n    ExtendName :");

printf ("%s", MyFile.FileName.EName);

}

while(1);

}

圖 17-1 所(suo)示是運行的(de)結果(guo),A 中所(suo)示是說明例程中聯(lian)合中的(de)數組(zu)和結構(gou)佔用的(de)是同(tong)一段地(di)址的(de)內(na)存空(kong)間,而結構(gou)中的(de)兩數組(zu)是各(ge)佔兩段不一樣內(na)存空(kong)間。


圖 17-1

在(zai)此簡(jian)單的(de)單片機C語言教程就結束了,限于作者的(de)水平不能詳盡(jin)書寫(xie)。作者本人也是 一名業(ye)余的(de)單片機愛好(hao)者,希望(wang)能和更多相同(tong)興趣的(de)朋友學習交(jiao)流,讀者朋友也能訪問網站 http://www.51hei.com 或電(dian)郵 51hei@163.com,得到本文相關的(de)更多資訊。本教程所(suo)涉及c51源代碼請(qing)點此下載

500万彩票官网

500万彩票官网

500万彩票官网 | 下一页