C程序設(shè)計第11章.ppt_第1頁
C程序設(shè)計第11章.ppt_第2頁
C程序設(shè)計第11章.ppt_第3頁
C程序設(shè)計第11章.ppt_第4頁
C程序設(shè)計第11章.ppt_第5頁
已閱讀5頁,還剩89頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、1,第十一章結(jié)構(gòu)體與共用體,2,11.1定義一個結(jié)構(gòu)體的一般形式,在實際問題中,一組數(shù)據(jù)往往具有不同的數(shù)據(jù)類型。 例如,在學(xué)生登記表中,姓名應(yīng)為字符型;學(xué)號可為整型或字符型;年齡應(yīng)為整型;性別應(yīng)為字符型;成績可為整型或?qū)嵭汀?顯然不能用一個數(shù)組來存放這一組數(shù)據(jù)。因為數(shù)組中各元素的類型和長度都必須一致,以便于編譯系統(tǒng)處理。 為了解決這個問題,語言中給出了另一種構(gòu)造數(shù)據(jù)類型“結(jié)構(gòu)(structure)”或叫“結(jié)構(gòu)體”。,3,11.1定義一個結(jié)構(gòu)的一般形式,“結(jié)構(gòu)”是一種構(gòu)造類型,它是由若干“成員”組成的。 每一個成員可以是一個基本數(shù)據(jù)類型或者又是一個構(gòu)造類型。 結(jié)構(gòu)既是一種“構(gòu)造”而成的數(shù)據(jù)類型,

2、那么在說明和使用之前必須先定義它,也就是構(gòu)造它。如同在說明和調(diào)用函數(shù)之前要先定義函數(shù)一樣。,4,11.1定義一個結(jié)構(gòu)的一般形式,定義一個結(jié)構(gòu)的一般形式為: struct 結(jié)構(gòu)名 成員表列; 成員表列由若干個成員組成,每個成員都是該結(jié)構(gòu)的一個組成部分。對每個成員也必須作類型說明,其形式為: 類型說明符 成員名; 成員名的命名應(yīng)符合標識符的書寫規(guī)定。,5,例如:,struct stu int num; char name20; char sex; float score; ;,結(jié)構(gòu)名為stu,由4個成員組成。 第一個成員為num,整型變量; 第二個成員為name,字符數(shù)組; 第三個成員為sex,字

3、符變量; 第四個成員為score,實型變量. 應(yīng)注意在括號后的分號是不可少的。 結(jié)構(gòu)定義之后,即可進行變量說明.凡說明為結(jié)構(gòu)stu的變量都由上述4個成員組成。 由此可見, 結(jié)構(gòu)是一種復(fù)雜的數(shù)據(jù)類型,是數(shù)目固定,類型不同的若干有序變量的集合。,6,11.2結(jié)構(gòu)類型變量的說明,說明結(jié)構(gòu)變量有三種方法。,7,1.先定義結(jié)構(gòu),再說明結(jié)構(gòu)變量。,如: struct stu int num; char name20; char sex; float score; ; struct stu boy1,boy2;,說明了兩個變量boy1和boy2為stu結(jié)構(gòu)類型。,8,也可以用宏定義使一個符號常量來表示一個結(jié)

4、構(gòu)類型。例如:,#define STU struct stu STU int num; char name20; char sex; float score; ; STU boy1,boy2;,9,2.在定義結(jié)構(gòu)類型的同時說明結(jié)構(gòu)變量。,這種形式說明的一般形式為: struct 結(jié)構(gòu)名 成員表列 變量名表列;,10,例如:,struct stu int num; char name20; char sex; float score; boy1,boy2;,11,3.直接說明結(jié)構(gòu)變量。,這種形式的說明的一般形式為: struct 成員表列 變量名表列;,12,例如:,struct int num

5、; char name20; char sex; float score; boy1,boy2;,第三種方法與第二種方法的區(qū)別在于第三種方法中省去了結(jié)構(gòu)名,而直接給出結(jié)構(gòu)變量。,13,三種方法中說明的boy1,boy2變量都具有下圖所示的結(jié)構(gòu):,說明了boy1,boy2變量為stu類型后,即可向這兩個變量中的各個成員賦值。,14,成員也可以又是一個結(jié)構(gòu),即構(gòu)成了嵌套的結(jié)構(gòu)。例如,下圖給出了另一個數(shù)據(jù)結(jié)構(gòu)。,15,按圖可給出以下結(jié)構(gòu)定義:,struct date int month; int day; int year; ; struct int num; char name20; char s

6、ex; struct date birthday; float score; boy1,boy2;,首先定義一個結(jié)構(gòu)date,由month(月)、day(日)、year(年) 三個成員組成. 在定義并說明變量 boy1 和 boy2 時,其中的成員birthday被說明為data結(jié)構(gòu)類型。成員名可與程序中其它變量同名,互不干擾。,16,11.3結(jié)構(gòu)變量成員的表示方法,在程序中使用結(jié)構(gòu)變量時,往往不把它作為一個整體來使用。在ANSI C中除了允許具有相同類型的結(jié)構(gòu)變量相互賦值以外,一般對結(jié)構(gòu)變量的使用,包括賦值、輸入、輸出、運算等都是通過結(jié)構(gòu)變量的成員來實現(xiàn)的。,17,表示結(jié)構(gòu)變量成員的一般形式

7、是:,結(jié)構(gòu)變量名.成員名,18,例如:,boy1.num 即第一個人的學(xué)號 boy2.sex 即第二個人的性別,19,如果成員本身又是一個結(jié)構(gòu)則必須逐級找到最低級的成員才能使用。,例如: boy1.birthday.month 即第一個人出生的月份成員可以在程序中單獨使用,與普通變量完全相同。,20,11.4結(jié)構(gòu)變量的賦值,結(jié)構(gòu)變量的賦值就是給各成員賦值??捎幂斎胝Z句或賦值語句來完成。,21,【例11.1】給結(jié)構(gòu)變量賦值并輸出其值。,main() struct stu int num;char *name;char sex; float score; boy1,boy2; boy1.num=1

8、02; =Zhang ping; printf(input sex and scoren); scanf(%c %f, ,22,11.5結(jié)構(gòu)變量的初始化,和其他類型變量一樣,對結(jié)構(gòu)變量可以在定義時進行初始化賦值。,23,【例11.2】對結(jié)構(gòu)變量初始化。,main() struct stu /*定義結(jié)構(gòu)*/ int num; char *name; char sex; float score; boy2,boy1=102,Zhang ping,M,78.5; boy2=boy1; printf(Number=%dnName=%sn,boy2.num,); pr

9、intf(Sex=%cnScore=%fn,boy2.sex,boy2.score); ,24,11.6結(jié)構(gòu)數(shù)組的定義,數(shù)組的元素也可以是結(jié)構(gòu)類型的。因此可以構(gòu)成結(jié)構(gòu)型數(shù)組。結(jié)構(gòu)數(shù)組的每一個元素都是具有相同結(jié)構(gòu)類型的下標結(jié)構(gòu)變量。在實際應(yīng)用中,經(jīng)常用結(jié)構(gòu)數(shù)組來表示具有相同數(shù)據(jù)結(jié)構(gòu)的一個群體。如一個班的學(xué)生檔案,一個車間職工的工資表等。 方法和結(jié)構(gòu)變量相似,只需說明它為數(shù)組類型即可。,25,例如:,struct stu int num; char *name; char sex; float score; boy5;,定義了一個結(jié)構(gòu)數(shù)組boy,共有5個元素,boy0boy4。每個數(shù)組元素都具有s

10、truct stu的結(jié)構(gòu)形式。,26,對結(jié)構(gòu)數(shù)組可以作初始化賦值。例如:,struct stu int num; char *name; char sex; float score; boy5= 101,Li ping,M,45, 102,Zhang ping,M,62.5, 103,He fang,F,92.5, 104,Cheng ling,F,87, 105,Wang ming,M,58 ;,當對全部元素作初始化賦值時,也可不給出數(shù)組長度。,27,【例11.3】計算學(xué)生的平均成績和不及格的人數(shù)。,struct stu int num; char *name; char sex; floa

11、t score; boy5= 101,Li ping,M,45, 102,Zhang ping,M,62.5, 103,He fang,F,92.5, 104,Cheng ling,F,87, 105,Wang ming,M,58 ;,28,【例11.3】計算學(xué)生的平均成績和不及格的人數(shù)。,main() int i,c=0; float ave,s=0; for(i=0;i5;i+) s+=boyi.score; if(boyi.score60) c+=1; printf(s=%fn,s); ave=s/5; printf(average=%fncount=%dn,ave,c); ,29,【例

12、11.4】建立同學(xué)通訊錄,#includestdio.h #define NUM 3 struct mem char name20; char phone10; ;,30,【例11.4】建立同學(xué)通訊錄,main() struct mem manNUM; int i; for(i=0;iNUM;i+) printf(input name:n); gets(); printf(input phone:n); gets(mani.phone); printf(nametttphonenn); for(i=0;iNUM;i+) printf(%sttt%sn,,ma

13、ni.phone); ,31,11.7結(jié)構(gòu)指針變量的說明和使用,32,11.7.1指向結(jié)構(gòu)變量的指針,一個指針變量當用來指向一個結(jié)構(gòu)變量時,稱之為結(jié)構(gòu)指針變量。結(jié)構(gòu)指針變量中的值是所指向的結(jié)構(gòu)變量的首地址。通過結(jié)構(gòu)指針即可訪問該結(jié)構(gòu)變量,這與數(shù)組指針和函數(shù)指針的情況是相同的。,33,結(jié)構(gòu)指針變量說明的一般形式為:,struct 結(jié)構(gòu)名 *結(jié)構(gòu)指針變量名,34,例如:,在前面的例題中定義了stu這個結(jié)構(gòu),如要說明一個指向stu的指針變量pstu,可寫為: struct stu *pstu; 當然也可在定義stu結(jié)構(gòu)時同時說明pstu。,35,與前面討論的各類指針變量相同,結(jié)構(gòu)指針變量也必須要先賦

14、值后才能使用:,賦值是把結(jié)構(gòu)變量的首地址賦予該指針變量,不能把結(jié)構(gòu)名賦予該指針變量。如果boy是被說明為stu類型的結(jié)構(gòu)變量,則: pstu= 是錯誤的。,36,結(jié)構(gòu)名和結(jié)構(gòu)變量是兩個不同的概念,不能混淆:,結(jié)構(gòu)名只能表示一個結(jié)構(gòu)形式,編譯系統(tǒng)并不對它分配內(nèi)存空間。只有當某變量被說明為這種類型的結(jié)構(gòu)時,才對該變量分配存儲空間。因此上面 char *name; char sex; float score; boy1=102,Zhang ping,M,78.5,*pstu;,40,【例11.5】,main() pstu= ,41,可以看出:,結(jié)構(gòu)變量.成員名 (*結(jié)構(gòu)指針變量).成員名 結(jié)構(gòu)指針變

15、量-成員名 這三種用于表示結(jié)構(gòu)成員的形式是完全等效的。,42,11.7.2指向結(jié)構(gòu)數(shù)組的指針,指針變量可以指向一個結(jié)構(gòu)數(shù)組,這時結(jié)構(gòu)指針變量的值是整個結(jié)構(gòu)數(shù)組的首地址。結(jié)構(gòu)指針變量也可指向結(jié)構(gòu)數(shù)組的一個元素,這時結(jié)構(gòu)指針變量的值是該結(jié)構(gòu)數(shù)組元素的首地址。,43,例如:,設(shè)ps為指向結(jié)構(gòu)數(shù)組的指針變量; 則ps也指向該結(jié)構(gòu)數(shù)組的0號元素; ps+1指向1號元素; ps+i則指向i號元素。 這與普通數(shù)組的情況是一致的。,44,【例11.6】用指針變量輸出結(jié)構(gòu)數(shù)組。,struct stu int num; char *name; char sex; float score; boy5= 101,Zh

16、ou ping,M,45, 102,Zhang ping,M,62.5, 103,Liou fang,F,92.5, 104,Cheng ling,F,87, 105,Wang ming,M,58, ;,45,【例11.6】用指針變量輸出結(jié)構(gòu)數(shù)組。,main() struct stu *ps; printf(NotNametttSextScoretn); for(ps=boy;psnum,ps-name,ps-sex, ps- score); ,46,應(yīng)該注意的是:,一個結(jié)構(gòu)指針變量雖然可以用來訪問結(jié)構(gòu)變量或結(jié)構(gòu)數(shù)組元素的成員,但是,不能使它指向一個成員。也就是說不允許取一個成員的地址來賦予它

17、。因此,下面的賦值是錯誤的。 ps=(賦予0號元素首地址),47,11.7.3結(jié)構(gòu)指針變量作函數(shù)參數(shù),在ANSI C標準中允許用結(jié)構(gòu)變量作函數(shù)參數(shù)進行整體傳送。但是這種傳送要將全部成員逐個傳送,特別是成員為數(shù)組時將會使傳送的時間和空間開銷很大,嚴重地降低了程序的效率。因此最好的辦法就是使用指針,即用指針變量作函數(shù)參數(shù)進行傳送。這時由實參傳向形參的只是地址,從而減少了時間和空間的開銷。,48,【例11.7】計算一組學(xué)生的平均成績和不及格人數(shù)。用結(jié)構(gòu)指針變量作函數(shù)參數(shù)編程。,struct stu int num; char *name; char sex; float score;boy5= 10

18、1,Li ping,M,45, 102,Zhang ping,M,62.5, 103,He fang,F,92.5, 104,Cheng ling,F,87, 105,Wang ming,M,58, ;,49,【例11.7】計算一組學(xué)生的平均成績和不及格人數(shù)。用結(jié)構(gòu)指針變量作函數(shù)參數(shù)編程。,main() struct stu *ps; void ave(struct stu *ps); ps=boy; ave(ps); ,50,【例11.7】計算一組學(xué)生的平均成績和不及格人數(shù)。用結(jié)構(gòu)指針變量作函數(shù)參數(shù)編程。,void ave(struct stu *ps) int c=0,i; float a

19、ve,s=0; for(i=0;iscore; if(ps-score60) c+=1; printf(s=%fn,s); ave=s/5; printf(average=%fncount=%dn,ave,c); ,51,11.8動態(tài)存儲分配,在數(shù)組一章中,曾介紹過數(shù)組的長度是預(yù)先定義好的,在整個程序中固定不變。語言中不允許動態(tài)數(shù)組類型。,52,例如:,int n; scanf(%d, 用變量表示長度,想對數(shù)組的大小作動態(tài)說明,這是錯誤的。,53,但是在實際的編程中,往往會發(fā)生這種情況,即所需的內(nèi)存空間取決于實際輸入的數(shù)據(jù),而無法預(yù)先確定。對于這種問題,用數(shù)組的辦法很難解決。為了解決上述問題,

20、語言提供了一些內(nèi)存管理函數(shù),這些內(nèi)存管理函數(shù)可以按需要動態(tài)地分配內(nèi)存空間,也可把不再使用的空間回收待用,為有效地利用內(nèi)存資源提供了手段。 常用的內(nèi)存管理函數(shù)有三個。,54,1.分配內(nèi)存空間函數(shù)malloc,調(diào)用形式: (類型說明符*)malloc(size) 功能:在內(nèi)存的動態(tài)存儲區(qū)中分配一塊長度為size字節(jié)的連續(xù)區(qū)域。函數(shù)的返回值為該區(qū)域的首地址。 “類型說明符”表示把該區(qū)域用于何種數(shù)據(jù)類型。 (類型說明符*)表示把返回值強制轉(zhuǎn)換為該類型指針。 “size”是一個無符號數(shù)。,55,例如:,pc=(char *)malloc(100); 表示分配100個字節(jié)的內(nèi)存空間,并強制轉(zhuǎn)換為字符數(shù)組類

21、型,函數(shù)的返回值為指向該字符數(shù)組的指針,把該指針賦予指針變量pc。,56,2.分配內(nèi)存空間函數(shù) calloc,calloc 也用于分配內(nèi)存空間。 調(diào)用形式: (類型說明符*)calloc(n,size) 功能:在內(nèi)存動態(tài)存儲區(qū)中分配n塊長度為“size”字節(jié)的連續(xù)區(qū)域。函數(shù)的返回值為該區(qū)域的首地址。 (類型說明符*)用于強制類型轉(zhuǎn)換。 calloc函數(shù)與malloc 函數(shù)的區(qū)別僅在于一次可以分配n塊區(qū)域。,57,例如:,ps=(struet stu*)calloc(2,sizeof(struct stu); 其中的sizeof(struct stu)是求stu的結(jié)構(gòu)長度。因此該語句的意思是:按

22、stu的長度分配2塊連續(xù)區(qū)域,強制轉(zhuǎn)換為stu類型,并把其首地址賦予指針變量ps。,58,3. 釋放內(nèi)存空間函數(shù)free,調(diào)用形式: free(void*ptr); 功能:釋放ptr所指向的一塊內(nèi)存空間,ptr是一個任意類型的指針變量,它指向被釋放區(qū)域的首地址。被釋放區(qū)應(yīng)是由malloc或calloc函數(shù)所分配的區(qū)域。,59,【例11.8】分配一塊區(qū)域,輸入一個學(xué)生數(shù)據(jù)。,main() struct stu int num;char *name;char sex; float score; *ps; ps=(struct stu*)malloc(sizeof(struct stu); ps-n

23、um=102; ps-name=Zhang ping; ps-sex=M; ps-score=62.5; printf(Number=%dnName=%sn,ps-num,ps-name); printf(Sex=%cnScore=%fn,ps-sex,ps-score); free(ps); ,60,11.8鏈表的概念,在例11.8中采用了動態(tài)分配的辦法為一個結(jié)構(gòu)分配內(nèi)存空間。每一次分配一塊空間可用來存放一個學(xué)生的數(shù)據(jù),我們可稱之為一個結(jié)點。有多少個學(xué)生就應(yīng)該申請分配多少塊內(nèi)存空間,也就是說要建立多少個結(jié)點。當然用結(jié)構(gòu)數(shù)組也可以完成上述工作,但如果預(yù)先不能準確把握學(xué)生人數(shù),也就無法確定數(shù)組大

24、小。而且當學(xué)生留級、退學(xué)之后也不能把該元素占用的空間從數(shù)組中釋放出來。,61,用動態(tài)存儲的方法可以很好地解決這些問題。有一個學(xué)生就分配一個結(jié)點,無須預(yù)先確定學(xué)生的準確人數(shù),某學(xué)生退學(xué),可刪去該結(jié)點,并釋放該結(jié)點占用的存儲空間。從而節(jié)約了寶貴的內(nèi)存資源。另一方面,用數(shù)組的方法必須占用一塊連續(xù)的內(nèi)存區(qū)域。而使用動態(tài)分配時,每個結(jié)點之間可以是不連續(xù)的(結(jié)點內(nèi)是連續(xù)的)。結(jié)點之間的聯(lián)系可以用指針實現(xiàn)。 即在結(jié)點結(jié)構(gòu)中定義一個成員項用來存放下一結(jié)點的首地址,這個用于存放地址的成員,常把它稱為指針域。,62,可在第一個結(jié)點的指針域內(nèi)存入第二個結(jié)點的首地址,在第二個結(jié)點的指針域內(nèi)又存放第三個結(jié)點的首地址,如

25、此串連下去直到最后一個結(jié)點。最后一個結(jié)點因無后續(xù)結(jié)點連接,其指針域可賦為0。這樣一種連接方式,在數(shù)據(jù)結(jié)構(gòu)中稱為“鏈表”。,63,下圖為最一簡單鏈表的示意圖:,圖中,第0個結(jié)點稱為頭結(jié)點,它存放有第一個結(jié)點的首地址,它沒有數(shù)據(jù),只是一個指針變量。以下的每個結(jié)點都分為兩個域,一個是數(shù)據(jù)域,存放各種實際的數(shù)據(jù),如學(xué)號num,姓名name,性別sex和成績score等。另一個域為指針域,存放下一結(jié)點的首地址。鏈表中的每一個結(jié)點都是同一種結(jié)構(gòu)類型。,64,例如,一個存放學(xué)生學(xué)號和成績的結(jié)點應(yīng)為以下結(jié)構(gòu):,struct stu int num; int score; struct stu *next; ,

26、前兩個成員項組成數(shù)據(jù)域,后一個成員項next構(gòu)成指針域,它是一個指向stu類型結(jié)構(gòu)的指針變量。,65,鏈表的基本操作以下幾種:,1. 建立鏈表; 2.結(jié)構(gòu)的查找與輸出; 3.插入一個結(jié)點; 4.刪除一個結(jié)點;,66,【例11.9】建立一個三個結(jié)點的鏈表,存放學(xué)生數(shù)據(jù)。為簡單起見, 我們假定學(xué)生數(shù)據(jù)結(jié)構(gòu)中只有學(xué)號和年齡兩項??删帉懸粋€建立鏈表的函數(shù)creat。程序如下:,#define NULL 0 #define TYPE struct stu #define LEN sizeof (struct stu) struct stu int num; int age; struct stu *ne

27、xt; ;,67,TYPE *creat(int n) struct stu *head,*pf,*pb; int i; for(i=0;inum, ,68,在函數(shù)外首先用宏定義對三個符號常量作了定義。這里用 TYPE表示struct stu,用LEN表示sizeof(struct stu)主要的目的是為了在以下程序內(nèi)減少書寫并使閱讀更加方便。結(jié)構(gòu)stu定義為外部類型,程序中的各個函數(shù)均可使用該定義。 creat函數(shù)用于建立一個有n個結(jié)點的鏈表,它是一個指針函數(shù),它返回的指針指向stu結(jié)構(gòu)。在creat函數(shù)內(nèi)定義了三個stu結(jié)構(gòu)的指針變量。head為頭指針,pf為指向兩相鄰結(jié)點的前一結(jié)點的指針

28、變量。pb為后一結(jié)點的指針變量。,69,11.8 共用體 構(gòu)造數(shù)據(jù)類型,也叫聯(lián)合體 用途:使幾個不同類型的變量共占一段內(nèi)存(相互覆蓋) 共用體類型定義 定義形式:,union 共用體名 類型標識符 成員名; 類型標識符 成員名; . ;,例 union data int i; char ch; float f; ;,類型定義不分配內(nèi)存,70,形式一: union data int i; char ch; float f; a,b;,形式二: union data int i; char ch; float f; ; union data a,b,c,*p,d3;,形式三: union int

29、i; char ch; float f; a,b,c;,共用體變量的定義,共用體變量定義分配內(nèi)存, 長度=最長成員所占字節(jié)數(shù),共用體變量任何時刻 只有一個成員存在,71,共用體變量引用 引用方式:,例 a.i=1; a.ch=a; a.f=1.5; printf(“%d”,a.i); (編譯通過,運行結(jié)果不對),引用規(guī)則 不能引用共用體變量,只能引用其成員,共用體變量中起作用的成員是最后一次存放的成員,例 union int i; char ch; float f; a; a=1; (),不能在定義共用體變量時初始化,例 union int i; char ch; float f; a=1,a

30、,1.5; (),可以用一個共用體變量為另一個變量賦值,例 float x; union int i; char ch; float f; a,b; a.i=1; a.ch=a; a.f=1.5; b=a; () x=a.f; (),72,例 將一個整數(shù)按字節(jié)輸出,運行結(jié)果: i=60501 ch0=101,ch1=141 ch0=A,ch1=a,main() union int_char int i; char ch2; x; x.i=24897; printf(i=%on,x.i); printf(ch0=%o,ch1=%on ch0=%c,ch1=%cn, x.ch0,x.ch1,x.c

31、h0,x.ch1); ,73,結(jié)構(gòu)體與共用體 區(qū)別: 存儲方式不同,聯(lián)系: 兩者可相互嵌套,74,例 結(jié)構(gòu)體中嵌套共用體,struct int num; char name10; char sex; char job; union int class; char position10; category; person2;,75,例共用體中嵌套結(jié)構(gòu)體,機器字數(shù)據(jù)與字節(jié)數(shù)據(jù)的處理,struct w_tag char low; char high; ; union u_tag struct w_tag byte_acc; int word_acc; u_acc;,76,11.10枚舉類型,在實際問

32、題中,有些變量的取值被限定在一個有限的范圍內(nèi)。例如,一個星期內(nèi)只有七天,一年只有十二個月,一個班每周有六門課程等等。如果把這些量說明為整型,字符型或其它類型顯然是不妥當?shù)?。為此,語言提供了一種稱為“枚舉”的類型。在“枚舉”類型的定義中列舉出所有可能的取值,被說明為該“枚舉”類型的變量取值不能超過定義的范圍。應(yīng)該說明的是,枚舉類型是一種基本數(shù)據(jù)類型,而不是一種構(gòu)造類型,因為它不能再分解為任何基本類型。,77,11.10.1枚舉類型的定義和枚舉變量的說明,1.枚舉的定義:枚舉類型定義的一般形式為: enum 枚舉名 枚舉值表 ; 在枚舉值表中應(yīng)羅列出所有可用值。這些值也稱為枚舉元素。,78,例如:

33、,enum weekday sun,mou,tue,wed,thu,fri,sat ; 該枚舉名為weekday,枚舉值共有7個,即一周中的七天。凡被說明為weekday類型變量的取值只能是七天中的某一天。,79,2.枚舉變量的說明,如同結(jié)構(gòu)和聯(lián)合一樣,枚舉變量也可用不同的方式說明,即先定義后說明,同時定義說明或直接說明。 設(shè)有變量a,b,c被說明為上述的weekday,可采用下述任一種方式: enum weekday sun,mou,tue,wed,thu,fri,sat ; enum weekday a,b,c; 或者為: enum weekday sun,mou,tue,wed,thu,

34、fri,sat a,b,c; 或者為: enum sun,mou,tue,wed,thu,fri,sat a,b,c;,80,11.10.2枚舉類型變量的賦值和使用,枚舉類型在使用中有以下規(guī)定: 1.枚舉值是常量,不是變量。不能在程序中用賦值語句再對它賦值。,81,例如對枚舉weekday的元素再作以下賦值:,sun=5; mon=2; un=mon; 都是錯誤的。,82,11.10.2枚舉類型變量的賦值和使用,2.枚舉元素本身由系統(tǒng)定義了一個表示序號的數(shù)值,從0開始順序定義為0,1,2。 如在weekday中,sun值為0,mon值為1,,sat值為6,83,【例11.10】,main() enum weekday sun,mon,tue,wed,thu,fri,sat a,b,c; a=sun; b=mon; c=tue; printf(%d,%d,%d,a,b,c); ,84,說明:,只能把枚舉值賦予枚舉變量,不能把元素的數(shù)值直接賦予枚舉變量。如: a=sun;

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論