結(jié)構(gòu)體、共用體與枚舉類型.ppt_第1頁
結(jié)構(gòu)體、共用體與枚舉類型.ppt_第2頁
結(jié)構(gòu)體、共用體與枚舉類型.ppt_第3頁
結(jié)構(gòu)體、共用體與枚舉類型.ppt_第4頁
結(jié)構(gòu)體、共用體與枚舉類型.ppt_第5頁
已閱讀5頁,還剩49頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、第8章 結(jié)構(gòu)體、共用體與枚舉類型,本章要求:,理解結(jié)構(gòu)體類型的概念,掌握結(jié)構(gòu)體變量的定義和使用; 掌握結(jié)構(gòu)體數(shù)組、結(jié)構(gòu)體指針的定義和使用; 理解鏈表的概念,掌握動態(tài)鏈表的常見操作; 理解共用體的概念,掌握共用體變量的定義和使用。,本章重點(diǎn): 動態(tài)鏈表的常見操作,本章難點(diǎn): 動態(tài)鏈表的常見操作,第8章 結(jié)構(gòu)體、共用體與枚舉類型,8.1 結(jié)構(gòu)體類型與結(jié)構(gòu)體變量 8.2 結(jié)構(gòu)體數(shù)組 8.3 結(jié)構(gòu)體與函數(shù) 8.4 動態(tài)數(shù)據(jù)結(jié)構(gòu)鏈表 8.5 共用體 8.6 枚舉類型 8.7 自定義類型標(biāo)識符(typedef),第8章 結(jié)構(gòu)體、共用體與枚舉類型,8.1 結(jié)構(gòu)體 C語言提供一種能集中不同數(shù)據(jù)類型于一體的數(shù)據(jù)

2、類型結(jié)構(gòu)體類型。結(jié)構(gòu)體類型的變量可以擁有不同數(shù)據(jù)類型的成員,是不同數(shù)據(jù)類型成員的集合。 結(jié)構(gòu)體是一種構(gòu)造數(shù)據(jù)類型 用途:把不同類型的數(shù)據(jù)組合成一個整體自定義數(shù)據(jù)類型,8.1 結(jié)構(gòu)體類型與結(jié)構(gòu)體變量,8.1.1 什么是結(jié)構(gòu)體類型,第4章學(xué)習(xí)的數(shù)組是一種簡單構(gòu)造類型數(shù)據(jù),數(shù)組中的各元素是屬于同一個類型的。但在實(shí)際處理的問題中,常會遇到這樣一類數(shù)據(jù),它由多個屬性各不相同的數(shù)據(jù)項(xiàng)組成,各個數(shù)據(jù)項(xiàng)用來描述一個共同的對象。 結(jié)構(gòu)體(structure)是一種數(shù)據(jù)類型。C語言本身沒有提供具體的結(jié)構(gòu)類型,但提供了說明結(jié)構(gòu)體類型的方法。,8.1.2 結(jié)構(gòu)體的聲明,聲明結(jié)構(gòu)體類型的一般形式:,struct 結(jié)構(gòu)體

3、名 結(jié)構(gòu)成員1; 結(jié)構(gòu)成員2; 結(jié)構(gòu)成員n; ;,8.1 結(jié)構(gòu)體類型與結(jié)構(gòu)體變量,例如:定義一個可描述學(xué)生基本情況的結(jié)構(gòu)體類型如下: struct student int num; char name20; char sex; int age; float score; ;,8.1 結(jié)構(gòu)體類型與結(jié)構(gòu)體變量,例 struct student int num; char name20; char sex; int age; float score; ; struct student stu1,stu2;,8.1.3 結(jié)構(gòu)體變量的定義 定義好一個結(jié)構(gòu)體類型后(也可以理解為是我們用戶自己定義的類型),

4、我們可以將其看作是和int、char、float等數(shù)據(jù)類型一樣的一個新的數(shù)據(jù)類型,可以用它定義變量,通過變量對結(jié)構(gòu)體中各成員的數(shù)據(jù)進(jìn)行處理。 1.先定義結(jié)構(gòu)體類型,再定義結(jié)構(gòu)體變量 一般形式:,struct 結(jié)構(gòu)體名 類型標(biāo)識符 成員名; 類型標(biāo)識符 成員名; . ; struct 結(jié)構(gòu)體名 變量名表列;,8.1 結(jié)構(gòu)體類型與結(jié)構(gòu)體變量,2. 定義結(jié)構(gòu)體類型的同時(shí)定義結(jié)構(gòu)體變量 一般形式:,struct 結(jié)構(gòu)體名 類型標(biāo)識符 成員名; 類型標(biāo)識符 成員名; . 變量名表列;,例 struct student int num; char name20; char sex; int age; fl

5、oat score; stu1,stu2;,8.1.3 結(jié)構(gòu)體變量的定義,3. 直接定義結(jié)構(gòu)體變量 一般形式:,struct 類型標(biāo)識符 成員名; 類型標(biāo)識符 成員名; . 變量名表列;,例 struct int num; char name20; char sex; int age; float score; stu1,stu2;,8.1.3 結(jié)構(gòu)體變量的定義,8.1.3 結(jié)構(gòu)體變量的引用,1結(jié)構(gòu)體變量的引用格式 結(jié)構(gòu)體變量名.成員名 其中:“.”是成員運(yùn)算符,它在所有的運(yùn)算符中優(yōu)先級最高。 例如,對上小節(jié)定義的學(xué)生情況結(jié)構(gòu)體變量stu1變量進(jìn)行賦值: stu1.num=10001; str

6、cpy(,”zhang”); stu1.sex=M; stu1.age=19; stu1.score=88; 不能把結(jié)構(gòu)變量作為整體進(jìn)行輸入輸出: scanf(“%d%s%c%d%f”,stu1); 正確的引用方式可以是: gets(); scanf(“%d%c%d%f”,2結(jié)構(gòu)體嵌套時(shí)逐級引用,struct date int month; int day; int year; ;,struct person char name20; char sex; struct date birthday; ;,若有定義: struct person person1;

7、 這時(shí)可以這樣訪問person1中的成員month: person1.birthday.month,8.1.3 結(jié)構(gòu)體變量的引用,8.1.3 結(jié)構(gòu)體變量的引用,33. 同類型結(jié)構(gòu)體變量間的整體賦值,結(jié)構(gòu)體變量可以通過整體賦值,將一個結(jié)構(gòu)體變量中的所有數(shù)據(jù),賦給另一個結(jié)構(gòu)體類型相同的結(jié)構(gòu)體變量中對應(yīng)的數(shù)據(jù)成員。,例8-1 建立一個學(xué)生的基本情況表,然后將其打印輸出。 程序如下:,#include #include main() struct student int num; char name20; char sex; int age; float score; stu1,stu2; stu1.

8、num=10001; strcpy(,zhang); stu1.sex=M; stu1.age=19; stu1.score=88; stu2=stu1; printf(stu1:%d,%s,%c,%d,%6.2fn,stu1.num,, stu1.sex,stu1.age,stu1.score); printf(stu2:%d,%s,%c,%d,%6.2fn,stu2.num,, stu2.sex,stu2.age,stu2.score); ,程序輸出結(jié)果如下: stu1:10001,zhang,M,19,88.00 stu2:10001

9、,zhang,M,19,88.00,struct 結(jié)構(gòu)體名 類型標(biāo)識符 成員名; 類型標(biāo)識符 成員名; . 結(jié)構(gòu)體變量=初始數(shù)據(jù);,例 struct student int num; char name20; char sex; int age; float score; stu1=10001,zhang,M,19,88;,8.1.4 結(jié)構(gòu)體變量的初始化,形式:,8.1.6 指向結(jié)構(gòu)體的指針,指向結(jié)構(gòu)體變量的指針的值是該結(jié)構(gòu)體變量所分配的存儲區(qū)域的首地址。,結(jié)構(gòu)指針變量的定義,例:struct student int num; char name20; char sex; int age; f

10、loat score; stu1=10001,”zhang”,M,19,88; struct student *p=stu1;,8.1.6 指向結(jié)構(gòu)體的指針,通過指針訪問結(jié)構(gòu)體變量的成員,結(jié)構(gòu)變量中簡單成員的引用形式有下面三種: 結(jié)構(gòu)變量名.成員名(名字引用); 結(jié)構(gòu)指針-成員名(指針引用); (*結(jié)構(gòu)指針).成員名(將指針轉(zhuǎn)化為名字引用);,例:若有定義:struct student *p,stu1;且p= 則要訪問stu1的成員(如age)有下三種方式: stu1.age 或 p-age 或 (*p).age,8.2 結(jié)構(gòu)體數(shù)組,8.1.1結(jié)構(gòu)體數(shù)組的定義,結(jié)構(gòu)體數(shù)組的定義方式同結(jié)構(gòu)體變量

11、一樣,也有3種方法,只需把結(jié)構(gòu)體變量換成結(jié)構(gòu)體數(shù)組即可。,例:struct student int num; char name20; char sex; int age; float score; ; struct student stu10;,結(jié)構(gòu)體數(shù)組的初始化,與通常數(shù)組的初始化類似。例如: struct student int num; char name20; char sex; int age; float score; stu4= 10001, Zhang ,M,19,80,10002, Li ,M,18,78, 10003,He,F,20,92.5,10004,Cheng,F,

12、18,70;,結(jié)構(gòu)體數(shù)組的初始化,8.2 結(jié)構(gòu)體數(shù)組,結(jié)構(gòu)體數(shù)組引用方式: 結(jié)構(gòu)體數(shù)組名下標(biāo).成員名 例:stu1.age+,8.2.2 結(jié)構(gòu)體數(shù)組與指針,指向結(jié)構(gòu)體數(shù)組的指針的值是該結(jié)構(gòu)體數(shù)組所分配的存儲區(qū)域的首地址。,例: struct student int num; char name20; char sex; int age; float score; ; struct student *p; struct student stu10; p=stu;,p就是指向結(jié)構(gòu)體數(shù)組stu的指針(如右圖所示),8.2.3 結(jié)構(gòu)體數(shù)組的應(yīng)用實(shí)例,例8-3,#define N 10 #include

13、 #include struct student /*定義student結(jié)構(gòu)體類型*/ int num; char name20; float score3; ; main() int i,j; struct student stuN; for(i=0;iN;i+) /*用for循環(huán)輸入10名學(xué)生的信息*/ scanf(%d,%s, ,例8-4:用指向結(jié)構(gòu)體數(shù)組的指針改寫例8-3,#define N 10 #include #include struct student int num; char name20; float score3; main() int i,j; struct stu

14、dent *p,stuN; p=stu; for(i=0;inum); printf(%s,p-name); printf(%6.1f,%6.1f,%6.1fn,p-score0,p-score1,p-score2); ,8.3 結(jié)構(gòu)體與函數(shù),結(jié)構(gòu)體類型的變量可以作函數(shù)的形參,調(diào)用時(shí)C直接把同類型結(jié)構(gòu)體實(shí)參變量的各個數(shù)據(jù)成員的值全部復(fù)制給形參的結(jié)構(gòu)體變量。為了提高效率和通用性,可以用指向結(jié)構(gòu)體變量(或數(shù)組)的指針作為函數(shù)的形參。函數(shù)也可以返回結(jié)構(gòu)體類型數(shù)據(jù)到主調(diào)函數(shù)中。,8.3.1 結(jié)構(gòu)體變量作函數(shù)參數(shù),例8-5 在例8-3中,10名學(xué)生的信息輸出改為通過調(diào)用print函數(shù)完成。,void p

15、rint(struct student stu) printf(%d,%s,%6.1f,%6.1f,%6.1fn,stu.num,, stu.score0,stu.score1,stu.score2); ,#define N 10 #include #include struct student ; main() int i,j; struct student stuN; void print(struct student stu); for(i=0;iN;i+) print(stui);/調(diào)用print函數(shù),8.3.2 返回結(jié)構(gòu)體的函數(shù),例8-6 建立10名學(xué)生的信息表,每個

16、學(xué)生的數(shù)據(jù)包括學(xué)號、姓名、及三門課的成績。輸出總分最高的學(xué)生記錄,要求將查找該記錄的過程編制為函數(shù)。,/查找最高分學(xué)生的記錄函數(shù),返回值為指向該記錄的指針 student *search_max(student *x,int n) int i,k=0; for(i=1;ixk.sum)k=i; return x+k; ,8.4 動態(tài)數(shù)據(jù)結(jié)構(gòu)鏈表,8.4.2 鏈表的基本結(jié)構(gòu),1 頭指針(head) 是一個指針變量,用來存放鏈表中第一個結(jié)點(diǎn)的地址。 2 鏈表中每一結(jié)點(diǎn)一般由兩大部分組成: (1)數(shù)據(jù)域,用于存放用戶需要用的實(shí)際數(shù)據(jù),可以是一個數(shù)據(jù)項(xiàng),也可以是多個數(shù)據(jù)項(xiàng)。 (2)指針域,用于存放和該

17、結(jié)點(diǎn)相鏈接的下一個結(jié)點(diǎn)的地址,一般通過一個指針變量來實(shí)現(xiàn)。 3尾結(jié)點(diǎn) 最后一個結(jié)點(diǎn)因其后續(xù)無結(jié)點(diǎn),該指針域不再指向其他結(jié)點(diǎn),它稱為尾結(jié)點(diǎn),它的地址部分存放一個“NULL”(表示空地址),鏈表到此結(jié)束。,8.4 動態(tài)數(shù)據(jù)結(jié)構(gòu)鏈表,8.4.3 鏈表結(jié)點(diǎn)的定義,鏈表結(jié)點(diǎn)數(shù)據(jù)可以用結(jié)構(gòu)體來描述,如圖8-4所示中的鏈表結(jié)點(diǎn)就可通過結(jié)構(gòu)體定義如下: struct student int num; float score; struct student *next; ; 以上定義了一個結(jié)構(gòu)體student類型,student類型數(shù)據(jù)包括3個數(shù)據(jù)成員:int類型num、float類型的score和指向另一個s

18、tudent類型數(shù)據(jù)的指針變量next。,8.4.4 動態(tài)存儲空間的建立和釋放,1動態(tài)存儲空間的建立 (1)malloc函數(shù),其函數(shù)原型為: void *malloc(unsigned int size); 其作用是在內(nèi)存的動態(tài)存儲區(qū)中分配一個長度為size的連續(xù)空間。,(2)sizeof(type)運(yùn)算符 計(jì)算所給數(shù)據(jù)類型type的字節(jié)數(shù),主要用來計(jì)算鏈表中結(jié)點(diǎn)所占動態(tài)存儲空間的字節(jié)數(shù)。,(3)calloc函數(shù),其函數(shù)原型為: void *calloc(unsigned n,unsigned size); 其作用是在內(nèi)存的動態(tài)區(qū)存儲中分配n個長度為size的連續(xù)空間。,8.4.4 動態(tài)存儲空

19、間的建立和釋放,2. 動態(tài)存儲空間的釋放 free函數(shù),其函數(shù)原型為: void free(void *p); 其作用是釋放由p指向的內(nèi)存區(qū),使這部分內(nèi)存區(qū)能被其他變量使用。p是調(diào)用calloc或malloc函數(shù)時(shí)返回的值。,鏈表的基本操作包括建立鏈表、輸出鏈表、查找鏈表中某個結(jié)點(diǎn)、在鏈表中插入一個新的結(jié)點(diǎn)、刪除鏈表中的某個結(jié)點(diǎn)。,8.4.5 動態(tài)鏈表的建立,建立鏈表的主要步驟:(鏈表結(jié)點(diǎn)為struct student類型數(shù)據(jù)結(jié)構(gòu)) (1) 先設(shè)三個指針變量:head、p1、p2,它們都是用來指向struct student類型數(shù)據(jù)的。 struct student *head=NULL,*p

20、1,*p2; head:頭指針變量,指向鏈表的第一個結(jié)點(diǎn),用作函數(shù)返回值。 P1:指向新申請的結(jié)點(diǎn)。 P2:指向鏈表的尾結(jié)點(diǎn),用P2-next= P1,實(shí)現(xiàn)將新申請的結(jié)點(diǎn)插入到鏈表尾,使之成為新的尾結(jié)點(diǎn)。 (2) malloc函數(shù)開辟第一個結(jié)點(diǎn),并使head和p2都指向它。 head=p2=(struct student * ) malloc(sizeof(struct student); /*申請一個新結(jié)點(diǎn)的空間*/ scanf(%d%f, /*讀入數(shù)據(jù)*/,8.4.5 動態(tài)鏈表的建立,(3) 再用malloc函數(shù)開辟另一個結(jié)點(diǎn)并使p1指向它,接著輸入該結(jié)點(diǎn)的數(shù)據(jù),并與上一結(jié)點(diǎn)相連,且使p2

21、指向新建立的結(jié)點(diǎn)。 建立新結(jié)點(diǎn):p1= ( struct student*) malloc(sizeof(struct student); scanf(%d%f, 如圖8-6(c)所示:,8-6(a),8-6(b),8-6(c),重復(fù)執(zhí)行第(3)步,可以建立第三個結(jié)點(diǎn),并使第三個結(jié)點(diǎn)和第二個結(jié)點(diǎn)鏈接(p2-next=p1;),依次創(chuàng)建后面的結(jié)點(diǎn),直到所有的結(jié)點(diǎn)建立完畢。 (4)為末結(jié)點(diǎn)的指針域賦值NULL (p2-next=NULL;),8.4.5 動態(tài)鏈表的建立,例8-7 建立有n個student類型結(jié)點(diǎn)的鏈表,n的值從鍵盤輸入,再輸出鏈表。,#define NULL 0 #define L

22、EN sizeof(struct student) #include #include /*定義結(jié)點(diǎn)*/ struct student int num; float score; struct student *next; ; /*main函數(shù)中,分別調(diào)用create和print函數(shù)建立和輸出鏈表*/ void main() int n; struct student *head; struct student create(int n); /*函數(shù)聲明*/ void print(struct student *head); /*函數(shù)聲明*/ printf(please input nn);

23、scanf(%d, ,/*create(int n)函數(shù): 創(chuàng)建一個具有頭結(jié)點(diǎn)的單鏈表*/ /*形參n值:創(chuàng)建鏈表的結(jié)點(diǎn)數(shù)*/ /*返回值:返回單鏈表的頭指針*/ struct student *create(int n) int i; struct student *head=NULL, *p1, *p2; head=p2=(struct student * ) malloc(LEN); /*申請一個新結(jié)點(diǎn)的空間*/ scanf(%d%f, ,例8-7 建立有n個student類型結(jié)點(diǎn)的鏈表,n的值從鍵盤輸入,再輸出鏈表。,/* void print(struct student *head

24、)為鏈表輸出函數(shù)*/ /*形參head為要輸出鏈表的頭指針*/ void print(struct student *head) struct student *p; p=head; while(p!=NULL) printf(%d,%6.1fn,p-num,p-score); p=p-next; /*移動指針*/ ,例8-7 建立有n個student類型結(jié)點(diǎn)的鏈表,n的值從鍵盤輸入,再輸出鏈表。,8.4.6 鏈表的刪除操作,下面討論在結(jié)點(diǎn)類型為student的鏈表中刪除num域?yàn)槟硞€值的結(jié)點(diǎn)的主要操作步驟(鏈表結(jié)點(diǎn)為struct student類型數(shù)據(jù)結(jié)構(gòu)): 設(shè)三個指針變量:head、p1

25、、p2,它們都是用來指向struct student類型數(shù)據(jù)的,head指向鏈表頭,若head=NULL,則鏈表為空,沒有可刪除結(jié)點(diǎn)。 查找要刪除的結(jié)點(diǎn),使p1指向它,p2指向p1的前一結(jié)點(diǎn)(前驅(qū))。有兩種情況:刪除首結(jié)點(diǎn)和其它結(jié)點(diǎn)。,(1)刪除首結(jié)點(diǎn) 使p1指向第一個結(jié)點(diǎn),用以下語句實(shí)現(xiàn)刪除首結(jié)點(diǎn)操作。 p1=head; head=p1-next; free(p1);,8.4.6 鏈表的刪除操作,(2)刪除其它結(jié)點(diǎn) 刪除鏈表的中間結(jié)點(diǎn)通過將下一結(jié)點(diǎn)地址賦給前一結(jié)點(diǎn)地址來實(shí)現(xiàn),也即將要刪除的p1結(jié)點(diǎn)的后繼地址,放入前一結(jié)點(diǎn)p2的地址域(p2-next=p1-next;),同時(shí)釋放p1結(jié)點(diǎn)。,/

26、*該函數(shù)的功能是從表頭指針為head的鏈表中刪除num域的值與形參num相等的結(jié)點(diǎn),釋放該結(jié)點(diǎn)的存儲空間,返回該鏈表的表頭指針。*/,struct student *delete(struct student *head,int num) struct student *p1,*p2; if (head=NULL) printf(list null!n); else p1=head; while(p1!=NULL ,8.4.6 鏈表的刪除操作,8.4.7 鏈表的插入操作,下面討論在結(jié)點(diǎn)類型為student的鏈表中插入一個新生結(jié)點(diǎn)的主要操作步驟(鏈表結(jié)點(diǎn)為struct student類型數(shù)據(jù)結(jié)構(gòu)

27、): 先設(shè)四個指針變量head、p0、p1、p2: head:要插入鏈表的頭指針。 P0:指向要插入的結(jié)點(diǎn)。 P1:指向當(dāng)前結(jié)點(diǎn),首先使p1 指向頭結(jié)點(diǎn)(p1=head)。 P2:指向前一結(jié)點(diǎn)(即P1 原來指向的結(jié)點(diǎn))。 首先查找插入的位置,應(yīng)插入的位置:p1之前,p2之后。 在鏈表中,各結(jié)點(diǎn)按成員score(成績)由小到大順序存放,從第一個結(jié)點(diǎn)開始,把待插入結(jié)點(diǎn)p0-score與每一個結(jié)點(diǎn)p1-score比較,若(p0-score) (p1-score),則p1移到下一個結(jié)點(diǎn)(p1=p1-next),同時(shí),p2也移到下一個位置(p2=p1)。,(1)原鏈表為空表 即head=NULL時(shí), 用

28、以下語句實(shí)現(xiàn)插入操作: head=p0;p0-next=NULL; p0是該鏈表惟一一個結(jié)點(diǎn)。 (2)在頭結(jié)點(diǎn)之前插入 當(dāng)p0-scorescore 時(shí),若p1=head,表示插入結(jié)點(diǎn)在頭結(jié)點(diǎn)之前。用以下語句實(shí)現(xiàn)插入操作: head=p0;p0-next=p1;,8.4.7 鏈表的插入操作,插入前,插入后,8.4.7 鏈表的插入操作,(3)在非頭結(jié)點(diǎn)之前,非尾節(jié)點(diǎn)之后插入 當(dāng)p0-scorescore,且p1head時(shí),表示在在非頭結(jié)點(diǎn)之前,非尾節(jié)點(diǎn)之后(中間結(jié)點(diǎn))插入結(jié)點(diǎn),用以下語句實(shí)現(xiàn)插入操作: p2-next=p0;p0-next=p1;,插入前,插入后,8.4.7 鏈表的插入操作,(4

29、)尾節(jié)點(diǎn)之后插入 當(dāng)p0-scorep1-score 時(shí),表示在尾節(jié)點(diǎn)之后插入結(jié)點(diǎn),用以下語句實(shí)現(xiàn)插入操作: p1-next=p0;p0-next=NULL;,插入前,插入后,函數(shù)insert的功能是:在一個有序鏈表中插入一個結(jié)點(diǎn)。,在鏈表head中,插入stud結(jié)點(diǎn),并返回新鏈表的表頭 struct student *insert(struct student *head,struct student *stud) struct student *p0,*p1,*p2; p1=head; p0=stud; if(head=NULL) /* 原鏈表是空表 */ head=p0; p0-next

30、=NULL; else /*while循環(huán)查找待插入的位置*/ while(p0-score p1-score) ,union 共用體名 類型標(biāo)識符 成員名; 類型標(biāo)識符 成員名; . ;,例 union data int i; float f; char ch; ;,1.共用體類型定義 定義形式:,構(gòu)造數(shù)據(jù)類型,也叫聯(lián)合體 用途:使幾個不同類型的變量共占一段內(nèi)存(相互覆蓋),8.5 共用體,形式一: union data int i; char ch; float f; a,b;,形式二: union data int i; char ch; float f; ; union data a,

31、b,c;,形式三: union int i; char ch; float f; a,b,c;,2.共用體變量的定義,8.5 共用體,共用體變量定義分配內(nèi)存長度=最長成員所占字節(jié)數(shù),8.5 共用體,共用變量的引用與結(jié)構(gòu)變量一樣,也只能逐個引用共用變量的成員。例如,訪問共用變量un1各成員的格式為:un1.i、un1.ch、un1.f。,對共用體變量的使用需要注意如下幾個問題: (1)系統(tǒng)采用覆蓋技術(shù),實(shí)現(xiàn)共用變量各成員的內(nèi)存共享,所以在某一時(shí)刻,存放的和起作用的是最后一次存入的成員值。 (2)由于所有成員共享同一內(nèi)存空間,故共用變量與其各成員的地址相同。 (3)不能對共用變量進(jìn)行初始化(注意:

32、結(jié)構(gòu)變量可以);也不能將共用變量作為函數(shù)參數(shù),以及使函數(shù)返回一個共用數(shù)據(jù),但可以使用指向共用變量的指針。 (4)共用類型可以出現(xiàn)在結(jié)構(gòu)類型定義中,反之亦然。,例8-9,8.5 共用體,假設(shè)一個學(xué)生的信息表中包括學(xué)號、姓名和一門課的成績。而成績通常又可采用兩種表示方法:一種是五分制,采用的是整數(shù)形式;另一種是百分制,采用的是浮點(diǎn)數(shù)形式,現(xiàn)要求編一程序,輸入一個學(xué)生的信息并顯示出來。 程序如下: #include struct stu_score int num; char name20; int type; /*type值為0時(shí)五分制,type值為1時(shí)百分制*/ union mixed int iscore; /*五分制*/ float fscore; /*百分制*/ score; ;,8.5 共用體,main() struct stu_score stud1; printf(please input num,name,type:n); scanf(%d%s%d, ,8.6 枚舉類型,1枚舉類型的定義 enum 枚舉類型名 取值表; 例如,enum weekdays Sun,Mon,Tue,Wed,Thu,F

溫馨提示

  • 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論