c語言用戶自定義數(shù)據(jù)類型.ppt_第1頁
c語言用戶自定義數(shù)據(jù)類型.ppt_第2頁
c語言用戶自定義數(shù)據(jù)類型.ppt_第3頁
c語言用戶自定義數(shù)據(jù)類型.ppt_第4頁
c語言用戶自定義數(shù)據(jù)類型.ppt_第5頁
已閱讀5頁,還剩71頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

,第十一章,用戶建立的數(shù)據(jù)類型,本章要點,結(jié)構(gòu)體的概念 結(jié)構(gòu)體的定義和引用 結(jié)構(gòu)體數(shù)組,主要內(nèi)容,11.1 結(jié)構(gòu)體類型和結(jié)構(gòu)體變量 11.2 結(jié)構(gòu)體數(shù)組 11.3 結(jié)構(gòu)體指針 11.4 用指針處理鏈表 11.5 共用體類型 11.6 枚舉類型 11.7 用typedef命名類型,11.1 結(jié)構(gòu)體類型和結(jié)構(gòu)體變量 11.1.1 結(jié)構(gòu)體類型,問題定義: 有時需要將不同類型的數(shù)據(jù)組合成一個有機 的整體,以便于引用。如: 一個學(xué)生有學(xué)號/姓名/性別/年齡/地址等屬性 int num; char name20; char sex; int age; int char addr30;,聲明一個結(jié)構(gòu)體類型的一般形式為: struct 結(jié)構(gòu)體名 成員表列; 如:struct student int num;char name20;char sex; int age;float score;char addr30; ,結(jié)構(gòu)體名,類型名,成員名,11.1 結(jié)構(gòu)體類型和結(jié)構(gòu)體變量 11.1.1 結(jié)構(gòu)體類型,說明: (1)結(jié)構(gòu)體類型并不是只有一種,而是可以設(shè)計出許多種結(jié)構(gòu)體類型. (2) 成員也可以是一個結(jié)構(gòu)體變量。 (3)“結(jié)構(gòu)體”這個詞是根據(jù)英文單詞structure譯出的。,11.1 結(jié)構(gòu)體類型和結(jié)構(gòu)體變量 11.1.1 結(jié)構(gòu)體類型,11.1.2 定義結(jié)構(gòu)體類型變量,可以采取以下3種方法定義結(jié)構(gòu)體類型變量: (1)先聲明結(jié)構(gòu)體類型再定義變量名 例如:struct student student1, student2; | | | 結(jié)構(gòu)體類型名 結(jié)構(gòu)體變量名 定義了student1和student2為struct student類型的變量,即它們具有struct student類型的結(jié)構(gòu).,在定義了結(jié)構(gòu)體變量后,系統(tǒng)會為之分配內(nèi)存單元。 例如:student1和student2在Turbo C的內(nèi)存中各占511個字節(jié)(2+20+1+2+4+30=511)。 (2)在聲明類型的同時定義變量 這種形式的定義的一般形式為: struct 結(jié)構(gòu)體名 成員表列 變量名表列;,11.1.2 定義結(jié)構(gòu)體類型變量,例如: struct student int num; char name20; char sex; int age; float score; char addr30; student1,student2;,它的作用與第一種方法相同,即定義了兩個struct student 類型的變量student1, student2,11.1.2 定義結(jié)構(gòu)體類型變量,(3) 不指定類型名而直接定義結(jié)構(gòu)體類型變量 其一般形式為: struct 成員表列 變量名表列; 即不出現(xiàn)結(jié)構(gòu)體名。,注意: (1) 結(jié)構(gòu)體類型與結(jié)構(gòu)體變量是不同的概念,不能混同。 (2) 結(jié)構(gòu)體類型中的成員名可以與程序中的變量名相同,但二者不代表同一對象。 (3) 對結(jié)構(gòu)體變量中的成員(即“域”),可以單獨使用,它的作用與地位相當(dāng)于普通變量。,11.1.2 定義結(jié)構(gòu)體類型變量,11.1.3 引用結(jié)構(gòu)體變量,在定義了結(jié)構(gòu)體變量以后,當(dāng)然可以引用這個變量。但應(yīng)遵守以下規(guī)則: (1)同類的結(jié)構(gòu)體變量可以互相賦值,如: student1=student2; 不能將一個結(jié)構(gòu)體變量作為一個整體進 行輸入和輸出。 例如: 已定義student1和student2為結(jié)構(gòu)體變量并且它們已有值。 printf(%d,%s,%c,%d,%f,%n,student1);,引用結(jié)構(gòu)體變量中成員的方式為 結(jié)構(gòu)體變量名.成員名 例如: student1.num表示student1變量中的num成員,即student1的num(學(xué)號)項??梢詫ψ兞康某蓡T賦值,例如:student1.num=10010;“.”是成員(分量)運算符,它在所有的運算符中優(yōu)先級最高,因此可以把student1.num作為一個整體來看待。上面賦值語句的作用是將整數(shù)10010賦給student1變量中的成員num。,11.1.3 引用結(jié)構(gòu)體變量,(2) 如果成員本身又屬一個結(jié)構(gòu)體類型,則要用若干個成員運算符,一級一級地找到最低的一級的成員。只能對最低級的成員進行賦值或存取以及運算。 例如: 對上面定義的結(jié)構(gòu)體變量student1, 可以這樣訪問各成員: student1.num student1.birthday.month,注意: 不能用student1.birthday來訪問student1變量中的成員birthday,因為birthday本身是一個結(jié)構(gòu)體變量。,11.1.3 引用結(jié)構(gòu)體變量,(3) 對結(jié)構(gòu)體變量的成員可以像普通變量一樣進行各種運算(根據(jù)其類型決定可以進行的運算)。 例如: student2.score=student1.score; sum=student1.score+student2.score; student1.age+; +student2.age;,由于“”運算符的優(yōu)先級最高,因此是對進行自加運算,而不是先對進行自加運算。,11.1.3 引用結(jié)構(gòu)體變量,(4) 可以引用結(jié)構(gòu)體變量成員的地址,也可以引用結(jié)構(gòu)體變量的地址。 例如: scanf(%d, (輸入student1.num的值) printf(%o,student1); (輸出student1的首地址),11.1.3 引用結(jié)構(gòu)體變量,但不能用以下語句整體讀入結(jié)構(gòu)體變量, 例如: scanf(%d,s,c,d,f,s,student1); 結(jié)構(gòu)體變量的地址主要用作函數(shù)參數(shù), 傳遞結(jié)構(gòu)體變量的地址。,11.1.3 引用結(jié)構(gòu)體變量,11.1.4 結(jié)構(gòu)體變量的初始化,但不能用以下語句整體讀入結(jié)構(gòu)體變量, 例如: scanf(%d,s,c,d,f,s,student1); 結(jié)構(gòu)體變量的地址主要用作函數(shù)參數(shù),傳遞結(jié)構(gòu)體變量的地址。,例11.1 對結(jié)構(gòu)體變量初始化. #include void main() struct student long int num; char name20; char sex; char addr20; a=10101,LiLin,M,123 Beijing Road; /* 對結(jié)構(gòu)體變量a賦初值*/ printf(No.:%ldnname:%snsex:%cnaddress:%sn,a.num,,a.sex,a.addr); ,運行結(jié)果: No.:10101 name:LiLin sex: address:123 Beijing Road,11.2 結(jié)構(gòu)體數(shù)組,一個結(jié)構(gòu)體變量中可以存放一組數(shù) 據(jù)(如一個學(xué)生的學(xué)號、姓名、成績等 數(shù)據(jù))。如果有個學(xué)生的數(shù)據(jù)需要 參加運算,顯然應(yīng)該用數(shù)組,這就是結(jié) 構(gòu)體數(shù)組。結(jié)構(gòu)體數(shù)組與以前介紹過的 數(shù)值型數(shù)組不同之處在于每個數(shù)組元素 都是一個結(jié)構(gòu)體類型的數(shù)據(jù),它們都分 別包括各個成員(分量)項。,11.2 結(jié)構(gòu)體數(shù)組,11.2.1 定義結(jié)構(gòu)體數(shù)組 和定義結(jié)構(gòu)體變量的方法相仿,只需說明其為數(shù)組即可。例如: struct student int num;char name20;char sex;int age; float score;char addr30; ;struct student3;,以上定義了一個數(shù)組stu,數(shù)組有個元素,均為struct student類型數(shù)據(jù)。,11.2 結(jié)構(gòu)體數(shù)組,也可以直接定義一個結(jié)構(gòu)體數(shù)組,例如: struct student int num; ;stu3; 或: strcut student int num; ;stu3;,圖11-3,11.2 結(jié)構(gòu)體數(shù)組,11.2.2 結(jié)構(gòu)體數(shù)組的初始化 與其他類型的數(shù)組一樣,對結(jié)構(gòu)體數(shù)組可以初始化。例如: struct student int num;char name20; char sex; int age; float score; char addr30; ;stu210101,LiLin,M,18,87.5,103 BeijingRoad,10102,Zhang Fun,M,111,1111,130 Shanghai Road;,圖11-4,11.2 結(jié)構(gòu)體數(shù)組,當(dāng)然,數(shù)組的初始化也可以用以下形式: struct student int num; ; struct student str,; 即先聲明結(jié)構(gòu)體類型,然后定義數(shù)組為該結(jié)構(gòu)體類型,在定義數(shù)組時初始化。,結(jié)構(gòu)體數(shù)組初始化的一般形式是在定義數(shù)組的后面加上“初值表列;”。,11.2 結(jié)構(gòu)體數(shù)組,11.2.3 結(jié)構(gòu)體數(shù)組應(yīng)用舉例,例11.2對候選人得票的統(tǒng)計程序。設(shè)有3個候選人,每次輸入一個得票的候選人的名字,要求最后輸出各人得票結(jié)果。 #include #include struct person char name20;in count; ; leader3=“Li”,0,”Zhang”,0,”Fun”,0,例11.2 void main() int i,j; char leader_name20; for(i=1;i=10;i+) scanf(“%s”,leader_name); for(j=0;j3;j+) if(strcmp(leader_name,)=0) leaderj.count+; printf(“n”); for(i=0;i3;i+) printf(“%5s:%dn”,,leaderi.count);,運行結(jié)果: : : :,11.2 結(jié)構(gòu)體數(shù)組,程序定義一個全局的結(jié)構(gòu)體數(shù)組leader,它有個元素,每一個元素包含兩個成員name(姓名)和count(票數(shù))。在定義數(shù)組時使之初始化,使3位候選人的票數(shù)都先置零. 在主函數(shù)中定義字符數(shù)組leader-name,它代表被選人的姓名,在10次循環(huán)中每次先輸入一個被選人的具體人名,然后把它與3個候選人姓名相比,看它和哪一個候選人的名字相同。在輸入和統(tǒng)計結(jié)束之后,將3人的名字和得票數(shù)輸出。,11.3 結(jié)構(gòu)體指針,結(jié)構(gòu)體指針是指向結(jié)構(gòu)體數(shù)據(jù)的指針,一個結(jié)構(gòu)體變量的起始地址就是這個結(jié)構(gòu)體變量的指針。指針變量既可以指向結(jié)構(gòu)體變量,也可以用來指向結(jié)構(gòu)體數(shù)組中的元素。但是,指針變量的基類型必須與結(jié)構(gòu)體變量的類型相同。 例如: struct student pt; /* pt可以指 向struct student類型的數(shù)據(jù) */ 11.3.1 指向結(jié)構(gòu)體變量的指針變量 下面通過一個簡單例子來說明指向結(jié)構(gòu)體變量的指針變量的應(yīng)用。,例11.通過指向結(jié)構(gòu)體變量的指針變量輸出該結(jié)構(gòu)體變量的信息。 #include #include void main() struct studentlong num;char name20; char sex; float score; struct student stu_1; struct student* p; p= ,定義指針變量p,指向struct student 類型的數(shù)據(jù),指向的結(jié)構(gòu)體變量中的成員,運行結(jié)果: :811101 name:LiLin sex: score:811.500000 :811101 name:LiLin sex: score:811.500000,11.3.1 指向結(jié)構(gòu)體變量的指針變量,程序分析: 在函數(shù)的執(zhí)行部分將結(jié)構(gòu)體變量-的起始地址賦給指針變量,也就是使指向-,然后對-的各成員賦值。第一個函數(shù)是輸出-的各個成員的值。用-表示-中的成員,依此類推。第二個函數(shù)也是用來輸出-各成員的值,但使用的是(*)這樣的形式。,圖11-6,11.3.1 指向結(jié)構(gòu)體變量的指針變量,以下3種形式等價: 結(jié)構(gòu)體變量成員名 (*)成員名 -成員名 其中-稱為指向運算符。,請分析以下幾種運算: -得到指向的結(jié)構(gòu)體變量中的成員的值。 - 得到指向的結(jié)構(gòu)體變量中的成員的值,用完該值后使它加。 - 得到指向的結(jié)構(gòu)體變量中的成員的值加,然后再使用它。,11.3.2 指向結(jié)構(gòu)體數(shù)組的指針,例11.4 指向結(jié)構(gòu)體數(shù)組元素的指針的應(yīng)用 #include struct student int num;char name20;char sex;int age; struct student stu3=10101,Li Lin,M,18,10102,Zhang Fun,M,111,10104,WangMing,F(xiàn),20; void main() struct student *p; printf( No. Name sex age); for (str;str;p) printf(%5d %-20s %2c %4dn,p-num, p-name, p-sex, p-age); ,運行結(jié)果: LiLin 18 Zhang Fun 111 WangMing 20,11.3.2 指向結(jié)構(gòu)體數(shù)組的指針,程序分析: 是指向struct student結(jié)構(gòu)體類型數(shù)據(jù)的指針變量。在for語句中先使的初值為stu,也就是數(shù)組stu第一個元素的起始地址。在第一次循環(huán)中輸出stu0的各個成員值。然后執(zhí)行,使自加。加意味著p所增加的值為結(jié)構(gòu)體數(shù)組stu的一個元素所占的字節(jié)數(shù)。執(zhí)行+后p的值等于stu 1,指向stu1。在第二次循環(huán)中輸出stu1的各成員值。在執(zhí)行后,p的值等于stu+2,再輸出stu 2的各成員值。在執(zhí)行+后,的值變?yōu)閟tu +, 已不再小于stu+3了,不再執(zhí)行循環(huán)。,圖11-7,11.3.2 指向結(jié)構(gòu)體數(shù)組的指針,注意: (1) 如果的初值為stu,即指向第一個元素,則加后p就指向下一個元素。例如: (+p)-num 先使自加,然后得到它指向的元素中的num成員值(即10102)。 (p+)-num 先得到-num的值(即10101),然后使自加,指向stu1。 請注意以上二者的不同。,11.3.2 指向結(jié)構(gòu)體數(shù)組的指針,注意: (2) 程序已定義了是一個指向struct student類型數(shù)據(jù)的指針變量,它用來指向一個struct student類型的數(shù)據(jù),不應(yīng)用來指向stu數(shù)組元素中的某一成員。 例如: 1a; 如果要將某一成員的地址賦給p,可以用強制類型轉(zhuǎn)換,先將成員的地址轉(zhuǎn)換成p的類型。 例如:( *)0a;,11.3 結(jié)構(gòu)體指針,11.3.3 結(jié)構(gòu)體變量和指向結(jié)構(gòu)體的指針作函數(shù)參數(shù) 將一個結(jié)構(gòu)體變量的值傳遞給另一個函數(shù),有3個方法 用結(jié)構(gòu)體變量的成員作參數(shù)。 (2) 用結(jié)構(gòu)體變量作實參。 (3) 用指向結(jié)構(gòu)體變量(或數(shù)組)的指針作實參,將結(jié)構(gòu)體變量(或數(shù)組)的地址傳給形參。,11.3 結(jié)構(gòu)體指針,例11.5 有一個結(jié)構(gòu)體變量stu,內(nèi)含學(xué)生學(xué)號、姓名和3門課程的成績。要求在main函數(shù)中賦予值,在另一函數(shù)print中將它們輸出。今用結(jié)構(gòu)體變量作函數(shù)參數(shù)。 #include struct student int num; char name20; float score3; ;,11.3 結(jié)構(gòu)體指針,void main() void print(struct student); struct student stu; stu.num=12345;strcpy(, LiLin;stu.score0=67.5;stu.score1=811; stu.score2 =78.6); print(stu); void print(struct student stu) printf(FORMAT,stu.num,, stu.score0, stu.score1,stu.score2); printf(n);,運行結(jié)果 67.500000 811.000000 78.5111111118,例11.6 將上題改用指向結(jié)構(gòu)體變量的指針作實參。 #include struct student int num; char name20; float score3; ;stu=12345, LiLi,67.5,811,78.6; void main() void print(struct student *); /*形參類型修改成指向結(jié)構(gòu)體的指針變量*/ print( /*實參改為stu的起始地址*/ void print(struct student *p) /*形參類型修改了*/ printf(FORMAT,p-num,p-name, p-score0,p-score1,p-score2); /*用指針變量調(diào)用各成員的值*/ printf();,運行結(jié)果 67.500000 811.000000 78.5111111118,11.3 結(jié)構(gòu)體指針,程序分析: 此程序改用在定義結(jié)構(gòu)體變量stu時賦初值,這樣程序可簡化些。print函數(shù)中的形參被定義為指向struct student類型數(shù)據(jù)的指針變量。注意在調(diào)用print函數(shù)時,用結(jié)構(gòu)體變量str的起始地址stu作實參。在調(diào)用函數(shù)時將該地址傳送給形參p(p是指針變量)。這樣就指向stu。在print函數(shù)中輸出所指向的結(jié)構(gòu)體變量的各個成員值,它們也就是stu的成員值. main函數(shù)中的對各成員賦值也可以改用scanf函數(shù)輸入.,圖11-8, 11.4 用指針處理鏈表,11.4.1 鏈表概述 鏈表是一種常見的重要的數(shù)據(jù)結(jié)構(gòu),是動 態(tài)地進行存儲分配的一種結(jié)構(gòu)。 鏈表的組成: 頭指針:存放一個地址,該地址指向一個元素 結(jié)點:用戶需要的實際數(shù)據(jù)和鏈接節(jié)點的指針,圖11-9, 11.4 用指針處理鏈表,用結(jié)構(gòu)體建立鏈表: struct student int num; float score; struct student *next ;; 其中成員num和score用來存放結(jié)點中的有用數(shù)據(jù)(用戶需要用到的數(shù)據(jù)),next是指針類型的成員,它指向struct student類型數(shù)據(jù)(這就是next所在的結(jié)構(gòu)體類型),圖11-10, 11.4 用指針處理鏈表,11.4.2 建立簡單的靜態(tài)鏈表,例11.7 建立一個如圖11.11所示的簡單鏈表,它由3個學(xué)生數(shù)據(jù)的結(jié)點組成。輸出各結(jié)點中的數(shù)據(jù)。 #include #define NULL 0 struct student long num; float score; struct student *next; ; main() struct student a,b,c,*head,*p; a. num=1111101; a.score=811.5; b. num=1111103; b.score=110; c. num=1111107; c.score=85; head= ,運行結(jié)果: 10101811.5 10103110.0 1010785.0, 11.4 用指針處理鏈表,程序分析: 開始時使head指向a結(jié)點,a.next指向b結(jié)點,b.next指向c結(jié)點,這就構(gòu)成鏈表關(guān)系?!癱.next=NULL” 的作用是使c.next不指向任何有用的存儲單元。在輸出鏈表時要借助p,先使p指向a結(jié)點,然后輸出a結(jié)點中的數(shù)據(jù),“p=p-next” 是為輸出下一個結(jié)點作準備。p-next的值是b結(jié)點的地址,因此執(zhí)行“p=p-next”后p就指向b結(jié)點,所以在下一次循環(huán)時輸出的是b結(jié)點中的數(shù)據(jù)。, 11.4 用指針處理鏈表,11.4.3 建立動態(tài)鏈表 所謂建立動態(tài)鏈表是指在程序執(zhí)行過程中從 無到有地建立起一個鏈表,即一個一個地開辟結(jié) 點和輸入各結(jié)點數(shù)據(jù),并建立起前后相鏈的關(guān)系 例11.8 寫一函數(shù)建立一個有3名學(xué)生數(shù)據(jù)的單向動 態(tài)鏈表. 算法如圖,圖11-11, 11.4 用指針處理鏈表,算法的實現(xiàn): 我們約定學(xué)號不會為零,如果輸入的學(xué)號為 ,則表示建立鏈表的過程完成,該結(jié)點不應(yīng)連 接到鏈表中。 如果輸入的p1-num不等于,則輸入的是第 一個結(jié)點數(shù)據(jù)(n=1),令headp1,即把p1的值 賦給head,也就是使head也指向新開辟的結(jié)點p1 所指向的新開辟的結(jié)點就成為鏈表中第一個結(jié)點,圖11-12, 11.4 用指針處理鏈表,算法的實現(xiàn): 再開辟另一個結(jié)點并使p1指向它,接著輸入該 結(jié)點的數(shù)據(jù).,如果輸入的p1-num,則應(yīng)鏈入第個結(jié)點 (n=2), 將新結(jié)點的地址賦給第一個結(jié)點的 next成員.,接著使,也就是使指向剛才建 立的結(jié)點,圖11-13, 11.4 用指針處理鏈表,算法的實現(xiàn): 再開辟一個結(jié)點并使p1指向它,并輸入該結(jié)點的 數(shù)據(jù).,在第三次循環(huán)中,由于(),又 將的值賦給-,也就是將第 個結(jié)點連接到第個結(jié)點之后,并使 ,使指向最后一個結(jié)點.,圖11-14, 11.4 用指針處理鏈表,算法的實現(xiàn): 再開辟一個新結(jié)點,并使p1指向它,輸入該結(jié) 點的數(shù)據(jù)。由于p1-num的值為,不再執(zhí)行循環(huán) ,此新結(jié)點不應(yīng)被連接到鏈表中.,將NULL賦給p2-next.,建立鏈表過程至此結(jié)束,p1最后所指的結(jié)點 未鏈入鏈表中,第三個結(jié)點的next成員的值 為NULL,它不指向任何結(jié)點。,圖11-15, 11.4 用指針處理鏈表,建立鏈表的函數(shù)如下: #include #include #define NULL 0 /令NULL代表,用它表示“空地址 #define LEN sizeof(struct student) /令LEN代表struct /student類型數(shù)據(jù)的長度 struct student long num; float score; struct student *next; ;int n; /n為全局變量,本文件模塊中各函數(shù)均可使用它, 11.4 用指針處理鏈表,struct student *creat() struct student *head; struct student *p1,*p2; n=0; p1=p2=( struct student*) malloc(LEN); scanf(“%ld,%f“, , 11.4 用指針處理鏈表,11.4.4 輸出鏈表 首先要知道鏈表第一個結(jié)點的地址,也就是 要知道head的值。然后設(shè)一個指針變量p,先指向 第一個結(jié)點,輸出所指的結(jié)點,然后使后移 一個結(jié)點,再輸出,直到鏈表的尾結(jié)點。,圖11-16,11-17, 11.4 用指針處理鏈表,例118 編寫一個輸出鏈表的函數(shù)print. void print(struct student *head) struct student *p; printf(“nNow,These %d records are:n“,n); p=head; if(head!=NULL) do printf(“%ld %5.1fn“,p-num,p-score); p=p-next; while(p!=NULL); , 11.4 用指針處理鏈表,可以把例11.7和例11.8合起來加上一個主函數(shù),組 成一個程序,即: #include #include #define LEN sizeof(struct student) struct student long num; float score; struct student *next; ; int n;, 11.4 用指針處理鏈表,struct student *creat() /* 建立鏈表的函數(shù) */ struct student *head; struct student *p1,*p2; n=0; p1=p2=( struct student*) malloc(LEN); scanf(“%ld,%f“, 11.4 用指針處理鏈表,p2=p1; p1=(struct student*)malloc(LEN); scanf(“%ld,%f“, 11.4 用指針處理鏈表,p=head; if(head!=NULL) do printf(“%ld %5.1fn“,p-num,p-score); p=p-next; while(p!=NULL); void main() struct student *head ; head=creat(); print(head); /* 調(diào)用print函數(shù) */ , 11.5 共用體類型,11.5.1 什么是共用體類型 使幾個不同的變量共占同一段內(nèi)存的結(jié)構(gòu)稱為 “共用體”類型的結(jié)構(gòu).,定義共用體類型變量的一般形式為: union 共用體名 成員表列 變量表列;,圖11-18, 11.5 共用體類型,例如: union data union data int i; int i; char ch; 或 char ch; float f; float f; a,b,c; ;union data a,b,c;, 11.5 共用體類型,共用體和結(jié)構(gòu)體的比較: 結(jié)構(gòu)體變量所占內(nèi)存長度是各成員占的內(nèi)存長度之和。每個成員分別占有其自己的內(nèi)存單元。 共用體變量所占的內(nèi)存長度等于最長的成員的長度。,共用體和結(jié)構(gòu)體的比較: 結(jié)構(gòu)體變量所占內(nèi)存長度是各成員占的內(nèi)存長度之和。每個成員分別占有其自己的內(nèi)存單元。 共用體變量所占的內(nèi)存長度等于最長的成員的長度。,例如:上面定義的“共用體”變量、各占 個字節(jié)(因為一個實型變量占個字節(jié)),而不 是各占個字節(jié)。, 11.5 共用體類型,11.5.2 共用體變量的引用方式 只有先定義了共用體變量才能引用它,而且不 能引用共用體變量,而只能引用共用體變量中的 成員。,例如:前面定義了a、b、c為共用體變量 a.i (引用共用體變量中的整型變量) a.ch(引用共用體變量中的字符變量) a.f (引用共用體變量中的實型變量), 11.5 共用體類型,11.5.3 共用體類型數(shù)據(jù)的特點 (1)同一個內(nèi)存段可以用來存放幾種不同類型的成員,但在每一瞬時只能存放其中一種,而不是同時存放幾種。 (2) 共用體變量中起作用的成員是最后一次存放的成員,在存入一個新的成員后原有的成員就失去作用。 (3) 共用體變量的地址和它的各成員的地址都是同一地址。, 11.5 共用體類型,(4) 不能對共用體變量名賦值,也不能企圖引用變量名來得到一個值,又不能在定義共用體變量時對它初始化。 (5) 以前的C規(guī)定不能把共用體變量作為函數(shù)參數(shù),但可以使用指向共用體變量的指針作函數(shù)參數(shù)。ANSI新標準放寬了限制,允許用共用體變量作為函數(shù)參數(shù)。 (6) 共用體類型可以出現(xiàn)在結(jié)構(gòu)體類型定義中,也可以定義共用體數(shù)組。反之,結(jié)構(gòu)體也可以出現(xiàn)在共用體類型定義中,數(shù)組也可以作為共用體的成員。, 11.5 共用體類型,例11.10 設(shè)有若干個人員的數(shù)據(jù),其中有學(xué)生和教師。學(xué)生的數(shù)據(jù)中包括:姓名、號碼、性別、職業(yè)、班級。教師的數(shù)據(jù)包括:姓名、號碼、性別、職業(yè)、職務(wù)??梢钥闯?,學(xué)生和教師所包含的數(shù)據(jù)是不同的?,F(xiàn)要求把它們放在同一表格中。,圖11-19, 11.5 共用體類型,#include struct int num; char name10; char sex; char job; union int banji; char position10; category; person2;/*先設(shè)人數(shù)為2*/,11.8 共用體,void main() int i; for(i=0;i2;i+) scanf(“%d %s %c %c“, ,運行情況如下: ,11.5 共用體類型,也可以不在結(jié)構(gòu)體類型的聲明中聲明共用體類型, 而把它放在結(jié)構(gòu)體類型的聲明之前,即: int i; union categ int banji; char position10; ; struct int num; char name10; char sex; char job; union categ category;person2;,11.6 枚舉類型,枚舉:將變量的值一一列舉出來,變量的值只限于列舉 出來的值的范圍內(nèi)。 聲明枚舉類型用enum enum weekdaysun,mon,tue,wed,thu,fri,sat; 定義變量: enum weekday workday,week-day; enumsun,mon,tue,wed,thu,fri,satworkday; 變量值只能是sun到sat之一,枚舉元素 枚舉常量,11.6 枚舉類型,說明: 在編譯中,對枚舉元素按常量處理,故稱枚舉 常量。它們不是變量,不能對它們賦值。 (2) 枚舉元素作為常量,它們是有值的,語言編譯 按定義時的順序使它們的值為, (3) 枚舉值可以用來作判斷比較。 (4) 一個整數(shù)不能直接賦給一個枚舉變量。,11.6 枚舉類型,例13口袋中有紅、黃、藍、白、黑5種顏色的球若干 個。每次從口袋中先后取出個球,問得到3種不同色的球 的可能取法,輸出每種排列的情況。,算法: 圖11-20 11-21,13.11 枚舉類型,#include main() enum color red,yellow,blue,white,black; enum color i,j,k,pri; int n,loop;n=0; for (i=red;i=black;i+) for (j=red;j=black;j+) if (i!=j) for (k=red;k=black;k+) if (k!

溫馨提示

  • 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)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論