版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、第11章 結(jié)構(gòu)體、聯(lián)合體與枚舉類型,結(jié)構(gòu)體類型是C語言允許用戶定義的又一重要的構(gòu)造數(shù)據(jù)類型。,11.1 結(jié)構(gòu)體的概念 11.2 結(jié)構(gòu)體數(shù)組 11.3 結(jié)構(gòu)體指針 11.4 鏈 表 11.5 聯(lián)合體數(shù)據(jù)類型 11.6 枚舉數(shù)據(jù)類型 11.7 自定義類型,11.1 結(jié)構(gòu)體的概念 結(jié)構(gòu)體類型是一種構(gòu)造數(shù)據(jù)類型,是數(shù)目固定,類型不同的若干有序數(shù)據(jù)項的集合。每個數(shù)據(jù)項稱為一個成員。每一個成員可以是一個基本數(shù)據(jù)類型或者是一個構(gòu)造類型。結(jié)構(gòu)體數(shù)據(jù)類型具有很強的數(shù)據(jù)描述能力,但C語言中并不提供現(xiàn)成的結(jié)構(gòu)體類型。因此,用戶在使用一個結(jié)構(gòu)體類型之前,必須先定義它,也就是要在程序中構(gòu)造所需要的數(shù)據(jù)類型。,11.1.
2、1 結(jié)構(gòu)體類型的定義 結(jié)構(gòu)體類型定義的一般形式為: struct 結(jié)構(gòu)體類型名 類型標(biāo)識符 成員名1; 類型標(biāo)識符 成員名2; 類型標(biāo)識符 成員名n; ;,例如,定義一個“學(xué)生信息”的結(jié)構(gòu)體類型如下: struct student int num; char name10; char sex; int age; char addr50; int score; ;,11.1.2 結(jié)構(gòu)體變量的定義、引用、初始化 1結(jié)構(gòu)體變量的定義 (1)先定義結(jié)構(gòu)體類型,再定義結(jié)構(gòu)體類型變量。 這種定義的一般形式為: struct 結(jié)構(gòu)體類型名 結(jié)構(gòu)體變量名表; 如上面定義了“學(xué)生信息”的結(jié)構(gòu)體類型struct
3、student后,就可以用它來定義結(jié)構(gòu)體變量。,例如: struct student stul,stu2; 定義了stul和stu2為struct student類型的變量,編譯系統(tǒng)為變量 stul與stu2分配存儲空間時,其存儲格式與結(jié)構(gòu)體類型struct student所描述的保持一致,結(jié)構(gòu)體中的各個成員按要求順序存放。每一個struct student類型的變量占用的存儲單元為67個字節(jié)。,(2)在定義結(jié)構(gòu)體類型的同時定義結(jié)構(gòu)體變量。 這種定義的一般形式為: struct 結(jié)構(gòu)體類型名 類型標(biāo)識符 成員名1; 類型標(biāo)識符 成員名2; 類型標(biāo)識符 成員名n; 結(jié)構(gòu)體變量名表;,例如: st
4、ruct student int num; char name10; char sex; int age; char addr50; int score; stu1,stu2; 這種定義與前面的定義功能相同,都是既定義了結(jié)構(gòu)體類型struct student,又定義了兩個結(jié)構(gòu)體變量stu1與stu2。,(3)直接定義結(jié)構(gòu)體類型的變量。 其一般形式為: struct 類型標(biāo)識符 成員名1; 類型標(biāo)識符 成員名2; 類型標(biāo)識符 成員名n; 結(jié)構(gòu)體變量名表;,例如: struct int num; char name10; char sex; int age; char addr50; int sc
5、ore; stu1,stu2;,2結(jié)構(gòu)體變量的引用 結(jié)構(gòu)體成員引用的一般形式如下: 結(jié)構(gòu)變量名.成員名 其中“.”為結(jié)構(gòu)體成員運算符,所有C語言運算符中它的優(yōu)先級最高,因此可以把上述引用形式作為一個整體來看待。 例如, 、stu2.score分別表示結(jié)構(gòu)體變量stu1的成員name與結(jié)構(gòu)體變量stu2的成員score。,例11.1 定義有關(guān)職工工資信息的結(jié)構(gòu)體類型變量(包括編號、姓名、基本工資、附加工資、水電費、實發(fā)工資),為結(jié)構(gòu)體變量中的成員賦值并輸出其值。 struct person int num; /* 職工編號*/ char *name; /* 姓名 */ floa
6、t base; /* 基本工資*/ float addition; /* 附加工資*/ float cost; /* 水電費*/ float salary; /* 實發(fā)工資*/ ; main() struct person employeea,employeeb; employeea.num=2086; =Zhao xiwang;,printf(input base,addition,cost:n); scanf(f,f,f, ,程序運行結(jié)果為: input base,addition,cost: 805.85,376.57,123.52 Number=2086 N
7、ame= Zhao xiwang Base=805.85 Addition=376.57 Cost=123.52 Salary=1085.90,3結(jié)構(gòu)體變量的初始化 結(jié)構(gòu)體變量的初始化和對數(shù)組的初始化相類似。將各個成員的初值用一對花括弧括起來,括弧內(nèi)各數(shù)據(jù)項的數(shù)據(jù)類型、順序要和結(jié)構(gòu)體類型說明中的成員類型相匹配,數(shù)據(jù)項間用逗號分隔。如果初值的個數(shù)少于結(jié)構(gòu)中成員的個數(shù),則余下的成員將自動初始化為0或NULL。 例如: struct student int num; char name10; char sex; int age; char addr50; int score; ;,main( ) s
8、truct student stu=1422,Lin Hui,M,18,Shang Hai,85; printf(Number=dnName=snSex=cn,stu.num,,stu.sex); printf(Age=dnAddress=snScore=dn,stu.age,stu.addr,stu.score); ,程序運行結(jié)果為: Number=1422 Name=Lin Hui Sex=M Age=18 Address=Shang Hai Score=85,11.1.3 結(jié)構(gòu)體的嵌套 結(jié)構(gòu)體類型定義時,其成員的類型也可以是結(jié)構(gòu)體類型,即結(jié)構(gòu)體類型定義是可以嵌套的。結(jié)構(gòu)體
9、定義的嵌套可以是多重的。,例如,定義一個“職工信息”的結(jié)構(gòu)體類型。每個職工包含編號(num)、姓名(name)、性別(sex)、出生日期(birthday)、家庭住址(addr)等信息。其中出生日期包括年(year)、月(month)、日(day)3個數(shù)據(jù)項,家庭住址包括城市(city)、街道(street)、門牌號碼(streetnum)等信息。職工信息的邏輯結(jié)構(gòu)如圖11.3所示。,圖11.3 職工信息邏輯結(jié)構(gòu),顯然“職工信息”中的“出生日期”和“家庭住址”應(yīng)該用結(jié)構(gòu)體類型描述,首先定義結(jié)構(gòu)體類型“日期”struct date和“住址”struct address如下。 struct dat
10、e int year; /*年 */ int month; /*月 */ int day; /*日 */ ; struct address char city50; /*城市*/ char street50; /*街道*/ int streetnum; /*門牌號碼*/ ;,然后定義結(jié)構(gòu)體類型“職工”struct employee如下。 struct employee int num; char name10; char sex; struct date birthday; struct address addr; ;,在結(jié)構(gòu)體類型struct employee中,成員birthday是str
11、uct date結(jié)構(gòu)體類型,它又有自己的成員year、month、day,成員addr是 struct address結(jié)構(gòu)體類型,它又有自己的成員city、street、streetnum,這就是結(jié)構(gòu)體類型的嵌套定義。 對于嵌套的結(jié)構(gòu)體,引用時應(yīng)按照從左到右,從外到內(nèi)的方式,用“”一級一級地運算,直到找到最低一級的成員。,例如: struct employee emp; emp.num=1001; strcpy(,Liu Xiaomei); emp.sex=F; emp.birthday.year=1986; emp.birthday.month=5; emp.birthday
12、.day=18; strcpy(emp.addr.city,Bei Jing); strcpy(emp.addr.street,Changan street); emp.addr.streetnum=168;,定義了struct employee類型的變量emp,對其各個成員賦值。賦值后結(jié)構(gòu)體變量emp在內(nèi)存中的存儲形式如圖11.4所示。,圖11.4 結(jié)構(gòu)體變量emp,11.2 結(jié)構(gòu)體數(shù)組,11.2.1 結(jié)構(gòu)體數(shù)組的定義,結(jié)構(gòu)體數(shù)組的定義方法與其他整型數(shù)組、實型數(shù)組和字符型數(shù)組的定義方法類似。例如: struct student int num; char name10; char sex;
13、int age; char addr50; int score; ; struct student stu40;,與結(jié)構(gòu)體變量的定義類似,結(jié)構(gòu)體數(shù)組的定義也可以采用以下的方式: struct student int num; char name10; char sex; int age; char addr50; int score; stu40;,或 struct int num; char name10; char sex; int age; char addr50; int score; stu40;,11.2.2 結(jié)構(gòu)體數(shù)組的引用 例11.3 輸入全班的學(xué)生的信息(包括學(xué)號、姓名、性別
14、、年齡、成績和家庭住址),并按成績由高到低的次序排序,輸出排序后的全班學(xué)生信息登記表。 struct student int num; char name10; char sex; int age; char addr50; int score; ;,main() struct student stu40,temp; int i,j,k; for(i=0;i40;i+) printf(n學(xué)號:); scanf ( d, ,for(i=0;i39;i+) k=i; for(j=i+1;j40;j+) if(stuk.scorestuj.score) k=j; temp=stui; stui=st
15、uk; stuk=temp; printf(n學(xué)號t姓名t性別t年齡t家庭住址t成績n); for(i=0;i40;i+) printf(dtstct, stui.num,,stui.sex); printf(dtsttdn, stui.age,stui.addr,stui.score); ,11.2.3 結(jié)構(gòu)體數(shù)組的初始化,struct student int num; char name10; char sex; int age; char addr50; int score; ; struct student stu5= 6001,Zhao zhen ,F,18,Bei
16、jing,85, 6002, Lin ping ,F,19, Shanghai,70, 6003,He fang,F,18,Qingdao,92, 6004,Zhou ming,F,19,Jinan,87, 6005,Wang tao,M,18,Dalian,68;,11.3 結(jié)構(gòu)體指針,11.3.1 指向結(jié)構(gòu)體變量的指針 結(jié)構(gòu)體變量所占內(nèi)存單元的首地址稱為結(jié)構(gòu)體變量的指針。指向一個結(jié)構(gòu)體變量的指針變量,稱為結(jié)構(gòu)體指針變量。結(jié)構(gòu)體指針變量中的值是所指向的結(jié)構(gòu)體變量的指針。 結(jié)構(gòu)體指針變量定義的一般形式為: struct 結(jié)構(gòu)體類型名 *結(jié)構(gòu)體指針變量名,有了結(jié)構(gòu)體指針變量后,就能更方便地訪問結(jié)
17、構(gòu)體變量的各個成員。利用指針引用結(jié)構(gòu)體成員的一般形式為: (*結(jié)構(gòu)體指針變量).成員名 例如: (*pstu).num=6001; C語言中為了直觀而方便地通過指針來引用結(jié)構(gòu)體成員,專門設(shè)置了指向運算符“”來訪問結(jié)構(gòu)體成員,一般形式為: 結(jié)構(gòu)體指針變量-成員名 例如: pstu-num=6001;,例11.4 編一程序,利用結(jié)構(gòu)體指針處理結(jié)構(gòu)體中的成員。 struct student int num; char name10; char sex; int age; char addr50; int score; ; main() ,struct student stu= 6001,Zhao z
18、hen ,F,18,Beijing,85,*pstu; pstu= ,程序運行結(jié)果為: Number=6001, Name =Zhao zhen, Sex=F Age=18, Address =Beijing, Score =85 Number=6001, Name =Zhao zhen, Sex=F Age=18, Address =Beijing, Score =85 Number=6001, Name =Zhao zhen, Sex=F Age=18, Address =Beijing, Score =85,11.3.2 指向結(jié)構(gòu)體數(shù)組的指針 同前面討論的指向數(shù)組的指針一樣,結(jié)構(gòu)體指針也
19、可用于指向結(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ù)組中的一個元素,這時結(jié)構(gòu)體指針變量的值是該結(jié)構(gòu)體數(shù)組元素的地址。,例11.5 利用結(jié)構(gòu)體指針變量輸出結(jié)構(gòu)體數(shù)組。,圖11.8 結(jié)構(gòu)數(shù)組的指針,11.3.3 結(jié)構(gòu)體指針作函數(shù)參數(shù) 結(jié)構(gòu)體變量作函數(shù)參數(shù)采取的是“單向值傳遞”方式,系統(tǒng)將實參結(jié)構(gòu)體的全部成員拷貝給被調(diào)用函數(shù)的形參。,例11.6 編寫程序,用結(jié)構(gòu)體指針變量作函數(shù)參數(shù),計算一組學(xué)生的平均成績和不及格人數(shù)。 struct student int num; char name10; int score; st
20、u5= 6001,Zhao zhen ,85,6002, Lin ping ,57,6003,He fang,62, 6004,Zhou ming,87, 6005,Wang tao,48; main() struct student *ps; void aver(struct student *ps); ps=stu; aver(ps); ,void aver(struct student *ps) int c=0,i; float ave,sum=0; for(i=0;iscore; if(ps-score60) c+=1; ave=sum/5; printf(average=.2fnco
21、unt=dn,ave,c); 程序運行結(jié)果為: average=67.80 count=2,11.4 鏈 表,11.5 聯(lián)合體數(shù)據(jù)類型,11.5.1 聯(lián)合體的定義,1聯(lián)合體類型的定義 定義一個聯(lián)合類型的一般形式為: union 聯(lián)合體類型名 類型標(biāo)識符 成員名1; 類型標(biāo)識符 成員名2; 類型標(biāo)識符 成員名n; ;,2聯(lián)合體變量的定義 (1)先定義聯(lián)合體類型,再定義聯(lián)合體變量。 (2)定義聯(lián)合體類型的同時定義聯(lián)合體變量。 (3)直接定義聯(lián)合體變量。,union udata類型的聯(lián)合體變量u,包含有3個成員i、c和f。注意,系統(tǒng)沒有分別給成員i,c,f,分配1個字節(jié),2個字節(jié),4個字節(jié)共7個字節(jié)
22、的存儲空間,而只分配一個成員項的空間,三個成員共同使用一塊內(nèi)存空間。但聯(lián)合體union udata中各個成員項的數(shù)據(jù)長度又互不相同,所以應(yīng)按其成員中數(shù)據(jù)長度最大的成員項f分配4個字節(jié)的內(nèi)存空間。聯(lián)合體變量u如果被賦予字符型值時就使用1個字節(jié)的存儲空間,被賦予整型值時就使用2個字節(jié)的存儲空間,被賦予實型值時,就使用4個字節(jié)的存儲空間。udata中的3個成員c,i,f,共同占用同一段內(nèi)存區(qū)的情況,如圖11.21所示。,圖11.21 聯(lián)合體變量共同占用內(nèi)存的情況,11.5.2 聯(lián)合體變量的引用 使用成員運算符“.”引用聯(lián)合體的成員,其一般格式為: 聯(lián)合變量名.成員名 例如u.i、u.c、u.f分別表
23、示聯(lián)合體變量u的成員i、c、f。聯(lián)合體變量的成員的使用方法與同類型的變量完全相同。但要注意的是,由于聯(lián)合體成員共同占用一塊內(nèi)存單元,一個聯(lián)合體變量,每次只能賦予一個成員值。因此某個時刻只能有一個成員變量起作用,其他的成員不起作用。并且在聯(lián)合體變量中起作用的成員是最后一次存放的成員,即在存入一個新的成員后,原來的成員就因被覆蓋而失去作用。,例11.15 分析下列程序的輸出結(jié)果。 main() union long a; int b; char c; m; m.a=65535; printf(ld d cn,m.a,m.b,m.c+66); 程序運行結(jié)果為: 65355 -1 A,程序中給聯(lián)合體m
24、的成員賦值為65535。假如聯(lián)合體變量m在內(nèi)存中分配的地址是2000H,那么m.a所占的內(nèi)存空間為2000H到2003H連續(xù)的四個字節(jié),其值為65535,在內(nèi)存中的存儲為(2000H)=(1111 1111)2 ,(2001H)=(1111 1111)2 ,(2002H)=(0000 0000)2 ,(2000H)=(0000 0000)2 ;m.b所占的內(nèi)存空間為2000H和2001H連續(xù)的兩個字節(jié),于是m.b的值為1;m.c所占的內(nèi)存空間為2000H,于是m.c的ascii值為255,程序中輸出m.c+66,得到的是ASCII值為65的字符,于是輸出A。,另外,可以通過指針來引用聯(lián)合體的成
25、員。其格式如下: (*指向聯(lián)合體變量指針名).成員名 或者 指向聯(lián)合體變量指針名-成員名 例如: union udata u,*pu; pu= 則指針pu指向聯(lián)合體變量u,通過指針pu可以訪問u中的各個成員。,例如: (*pu).i=23; 表示將23賦給pu指向的聯(lián)合體變量的成員i,或者 pu-i=23 以上兩種方法的效果是一樣的,但在使用指針訪問聯(lián)合體成員時,通常使用指向運算符“”訪問聯(lián)合體成員。,假設(shè)pu指向聯(lián)合體變量,則下面3個語句的效果是一樣的。 u.i=23; 等價于 (*pu).i=23; 等價于 pu-i=23 聯(lián)合體的特征決定了它的應(yīng)用遠不如結(jié)構(gòu)體應(yīng)用那樣廣泛。但是實際應(yīng)用中
26、,常常會出現(xiàn)一些量相互排斥的情況,這時用聯(lián)合體就非常方便。,11.6 枚舉數(shù)據(jù)類型,11.6.1 枚舉類型的定義 枚舉類型通過枚舉一系列有序的標(biāo)識符來定義。枚舉類型定義的一般格式為: enmu 枚舉名枚舉分量名1,枚舉分量名2,枚舉分量名n; 其中,enmu是定義枚舉類型的關(guān)鍵字。枚舉名遵循標(biāo)識符命名規(guī)則,用于標(biāo)識所定義的枚舉類型。枚舉分量也是一個合法的標(biāo)識符,由用戶根據(jù)需要自己確定,它們列出一個枚舉變量可以具有的值,又稱為枚舉常量。枚舉常量各自代表一個數(shù)值,因此它們之間有先后順序,可以進行比較。,例如: enum week sun ,mon,tue,wed,thu,fri,sut; 定義了一個枚舉類型enmu week,
溫馨提示
- 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. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年智能制造裝備入股合作協(xié)議范本
- 2024-2030年中國安全鞋內(nèi)鋼包頭市場競爭策略分析及發(fā)展趨勢研究報告
- 2024年度智能制造設(shè)備融資合作意向協(xié)議書3篇
- 2024-2030年中國反6烯十八酸項目可行性研究報告
- 梅河口康美職業(yè)技術(shù)學(xué)院《生態(tài)建筑》2023-2024學(xué)年第一學(xué)期期末試卷
- 眉山藥科職業(yè)學(xué)院《建筑室內(nèi)設(shè)計制圖與識圖》2023-2024學(xué)年第一學(xué)期期末試卷
- 2024年版公司股份轉(zhuǎn)讓及業(yè)務(wù)重組專項合同版B版
- 馬鞍山學(xué)院《鄉(xiāng)鎮(zhèn)總體規(guī)劃》2023-2024學(xué)年第一學(xué)期期末試卷
- 2024年度水暖電消防設(shè)施改造與節(jié)能降耗服務(wù)合同2篇
- 2024年小學(xué)三年級數(shù)學(xué)(北京版)-簡單分數(shù)的加減法-3學(xué)習(xí)任務(wù)單
- 2024年8月酒店銷售部工作計劃模板
- 大學(xué)美育-美育賞湖南(湖南高速鐵路職業(yè)技術(shù)學(xué)院)知到智慧樹答案
- 2024-2025學(xué)年語文二年級上冊 部編版期末測試卷(含答案)
- 菏澤學(xué)院課程與教學(xué)論(專升本)復(fù)習(xí)題
- 電梯井腳手架專項施工方案樣本
- 2024八大特殊作業(yè)安全管理培訓(xùn)
- 2025年江西省水利投資集團有限公司第二批次校園招聘筆試備考題庫及答案解析
- 2024年小紅書種草營銷師考試題庫
- Unit 4 Plants around us(說課稿)-2024-2025學(xué)年人教PEP版(2024)英語三年級上冊
- Unit 5 The colourful world Part A Letters and sounds(說課稿)-2024-2025學(xué)年人教PEP版(2024)英語三年級上冊
- 2024年抖音直播平臺搭建合同
評論
0/150
提交評論