版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、第9章 結(jié)構(gòu)體與共用體 1.理解數(shù)組、結(jié)構(gòu)體、共用體的區(qū)別;2.掌握結(jié)構(gòu)體定義和成員引用的方法;3.學(xué)會(huì)利用指針靈活地處理結(jié)構(gòu)體數(shù)據(jù);4.掌握結(jié)構(gòu)體數(shù)組的處理方法;5.掌握鏈表的概念和處理方法。 第9章 結(jié)構(gòu)體與共用體 9.1 結(jié)構(gòu)體類(lèi)型與結(jié)構(gòu)體變量的定義 9.2 結(jié)構(gòu)體變量的引用與初始化9.3 結(jié)構(gòu)體數(shù)組9.4 指向結(jié)構(gòu)體類(lèi)型數(shù)據(jù)的指針9.5 用typedef定義已有類(lèi)型的別名9.6 鏈表處理結(jié)構(gòu)指針的應(yīng)用 9.7 共用體和枚舉類(lèi)型9.1 結(jié)構(gòu)體類(lèi)型與結(jié)構(gòu)體變量的定義結(jié)構(gòu)體類(lèi)型,是一種復(fù)合的數(shù)據(jù)類(lèi)型,相當(dāng)于其它高級(jí)語(yǔ)言或數(shù)據(jù)庫(kù)中的”記錄”類(lèi)型,也可以當(dāng)作是面向?qū)ο蟪绦蛟O(shè)計(jì)中類(lèi)結(jié)構(gòu)的原始模型。
2、 定義結(jié)構(gòu)體是用struct關(guān)鍵字和一組定義各種數(shù)據(jù)段的語(yǔ)句塊的組合體,方式如下: struct 結(jié)構(gòu)體類(lèi)型名 /* struct是結(jié)構(gòu)體類(lèi)型關(guān)鍵字*/ 數(shù)據(jù)類(lèi)型 數(shù)據(jù)項(xiàng)1; 數(shù)據(jù)類(lèi)型 數(shù)據(jù)項(xiàng)2; 數(shù)據(jù)類(lèi)型 數(shù)據(jù)項(xiàng); ; 9.1 結(jié)構(gòu)體類(lèi)型與結(jié)構(gòu)體變量的定義定義一個(gè)存儲(chǔ)日期的結(jié)構(gòu)體類(lèi)型:struct date /*日期結(jié)構(gòu)體類(lèi)型:由年、月、日三項(xiàng)組成*/ int year; int month; int day;在定義結(jié)構(gòu)體時(shí),一定要注意在最后加一個(gè)分號(hào)?!敖Y(jié)構(gòu)體類(lèi)型名”和”數(shù)據(jù)項(xiàng)”的命名規(guī)則,與一般變量名相同。數(shù)據(jù)類(lèi)型相同的數(shù)據(jù)項(xiàng),既可逐個(gè)、逐行分別定義,也可合并成一行定義。9.1 結(jié)構(gòu)體類(lèi)
3、型與結(jié)構(gòu)體變量的定義結(jié)構(gòu)體類(lèi)型中的數(shù)據(jù)項(xiàng)的定義十分靈活。既可以是基本數(shù)據(jù)類(lèi)型,又可以是數(shù)組,還允許是另一個(gè)已經(jīng)定義的結(jié)構(gòu)體類(lèi)型。例如定義一個(gè)包含學(xué)生信息的結(jié)構(gòu)體類(lèi)型:struct student char no7; char name9; char sex4; struct date birthday; 變量?jī)?nèi)存地址noFFDCnameFFE3sexFFECbirthday.yearFFF0birthday.monthFFF2birthday.dayFFF49.1 結(jié)構(gòu)體類(lèi)型與結(jié)構(gòu)體變量的定義9.1.2 結(jié)構(gòu)體變量定義用戶自己定義的結(jié)構(gòu)體類(lèi)型,與系統(tǒng)定義的標(biāo)準(zhǔn)類(lèi)型(int、char等)一樣,可
4、用來(lái)定義結(jié)構(gòu)體變量的類(lèi)型。結(jié)構(gòu)體變量的定義方式有兩種:(1)間接定義法:先定義結(jié)構(gòu)體類(lèi)型、再定義結(jié)構(gòu)體變量結(jié)構(gòu)體變量的類(lèi)型名有兩部分組成:一是關(guān)鍵字struct;二是程序員定義的結(jié)構(gòu)體名,一般形式為:struct 結(jié)構(gòu)體名 結(jié)構(gòu)體變量名 9.1 結(jié)構(gòu)體類(lèi)型與結(jié)構(gòu)體變量的定義(2)直接定義法:在定義結(jié)構(gòu)體類(lèi)型的同時(shí),定義結(jié)構(gòu)體變量同時(shí)定義結(jié)構(gòu)體類(lèi)型及其結(jié)構(gòu)體變量的一般格式如下: struct 結(jié)構(gòu)體類(lèi)型名 結(jié)構(gòu)體變量表;要是定義多個(gè)??梢杂枚禾?hào)表達(dá)式分開(kāi)。 9.2 結(jié)構(gòu)體變量的引用與初始化9.2.1結(jié)構(gòu)體變量的引用規(guī)則結(jié)構(gòu)體類(lèi)型變量的各成員不能用結(jié)構(gòu)體名一起引用,必須單獨(dú)引用,成員運(yùn)算符”.”具
5、有最高優(yōu)先級(jí)。對(duì)于結(jié)構(gòu)體變量,要通過(guò)成員運(yùn)算符”.”,逐個(gè)訪問(wèn)其成員,且訪問(wèn)的格式為:結(jié)構(gòu)體變量.成員 /*其中的”.”是成員運(yùn)算符*/要引用結(jié)構(gòu)體變量student1中的學(xué)號(hào)no,可以用student1.no來(lái)表示;表示的意思是引用結(jié)構(gòu)體變量student1中的name成員,等等。 9.2 結(jié)構(gòu)體變量的引用與初始化如果結(jié)構(gòu)體成員本身又是結(jié)構(gòu)體類(lèi)型的,則可繼續(xù)使用成員運(yùn)算符取結(jié)構(gòu)體成員的結(jié)構(gòu)體成員,逐級(jí)向下,引用最低一級(jí)的成員。程序只能對(duì)最低一級(jí)的成員進(jìn)行運(yùn)算。此時(shí)的引用格式擴(kuò)展為: 結(jié)構(gòu)體變量.成員.子成員.最低1級(jí)子成員例如,引用結(jié)構(gòu)體變量student1中的bi
6、rthday成員的格式分別為: student1.birthday.year 9.2 結(jié)構(gòu)體變量的引用與初始化9.2.2結(jié)構(gòu)體變量的初始化結(jié)構(gòu)體變量初始化的格式,與一維數(shù)組相似: 結(jié)構(gòu)體變量=初值表初值的數(shù)據(jù)類(lèi)型,應(yīng)與結(jié)構(gòu)體變量中相應(yīng)成員所要求的一致,否則會(huì)出錯(cuò)。如果某成員本身又是結(jié)構(gòu)體類(lèi)型,則該成員的初值為一個(gè)初值表。例如:student1=“000102”, “Zhangsan”, “nan”, 1990,9,20。必須按結(jié)構(gòu)體定義的順序賦值。不要顛倒了。 9.2 結(jié)構(gòu)體變量的引用與初始化例9.2 利用例9.1中定義的結(jié)構(gòu)體類(lèi)型頭文件,定義一個(gè)結(jié)構(gòu)體變量student1,用于存儲(chǔ)和顯示一個(gè)
7、學(xué)生的基本情況。 程序運(yùn)行結(jié)果:No: 000102Name: ZhangsanSex: nanBirthday:1990-9-20 9.3 結(jié)構(gòu)體數(shù)組結(jié)構(gòu)體數(shù)組的每一個(gè)元素,都是結(jié)構(gòu)體類(lèi)型數(shù)據(jù),均包含結(jié)構(gòu)體類(lèi)型的所有成員。與結(jié)構(gòu)體變量的定義相似,結(jié)構(gòu)體數(shù)組的定義也分直接定義和間接定義兩種方法,只需用下標(biāo)運(yùn)算符”說(shuō)明為數(shù)組即可。與普通數(shù)組一樣,結(jié)構(gòu)數(shù)組也可在定義時(shí)進(jìn)行初始化。初始化的格式為: 結(jié)構(gòu)體數(shù)組n初值表1,初值表2,.,初值表n 9.3 結(jié)構(gòu)體數(shù)組例9.3 利用例9.1中定義的結(jié)構(gòu)體類(lèi)型struct student,定義一個(gè)結(jié)構(gòu)數(shù)組student2,用于存儲(chǔ)和顯示三個(gè)學(xué)生的基本情況。
8、程序運(yùn)行結(jié)果:No. Name Sex Birthday000102 Zhangsan nan 1990-9-20000105 Lisi nan 1990-9-15000112 Wangwu nv 1990-3-109.4 指向結(jié)構(gòu)體類(lèi)型數(shù)據(jù)的指針結(jié)構(gòu)體變量在內(nèi)存中的起始地址稱為結(jié)構(gòu)體變量的指針。與結(jié)構(gòu)體變量的定義相似,指向結(jié)構(gòu)體變量的指針的定義也分直接定義和間接定義兩種方法,只需在指針變量前加指針運(yùn)算符”*”說(shuō)明為指針即可。例如:struct student *pointer 9.4 指向結(jié)構(gòu)體類(lèi)型數(shù)據(jù)的指針通過(guò)指向結(jié)構(gòu)體變量的指針來(lái)訪問(wèn)結(jié)構(gòu)體變量的成員,與直接使用結(jié)構(gòu)體變量的效果一樣。一般
9、地說(shuō),如果指針變量pointer已指向結(jié)構(gòu)體變量student1(pointer=&student1),則以下三種形式等價(jià):(1)student1.成員(2)pointer-成員 /*”-“為指向運(yùn)算符*/(3)(*pointer).成員 /* “*pointer”外面的括號(hào)不能??!*/ 9.4 指向結(jié)構(gòu)體類(lèi)型數(shù)據(jù)的指針例9.4 使用指向結(jié)構(gòu)體變量的指針來(lái)訪問(wèn)結(jié)構(gòu)體變量的各個(gè)成員。 #include”struct.h”struct student student1=“000102”,”Zhangsan”,”nan”,1990,9,20;main() struct student *pointe
10、r=&student1; printf(“No: %sn”, pointer-no); printf(“Name: %sn”, pointer-name); printf(“Sex: %sn”, pointer-sex); printf(“Birthday: %d-%d-%dn”, pointer-birthday.year, pointer-birthday.month, pointer-birthday.day); 9.4 指向結(jié)構(gòu)體類(lèi)型數(shù)據(jù)的指針9.4.2 指向結(jié)構(gòu)數(shù)組的指針如果指針變量pointer已指向某結(jié)構(gòu)數(shù)組,則pointer +1指向結(jié)構(gòu)數(shù)組的下一個(gè)元素,而不是當(dāng)前元素的下一個(gè)
11、成員。另外,如果指針變量pointer已經(jīng)指向一個(gè)結(jié)構(gòu)體變量(或結(jié)構(gòu)數(shù)組),就不能再使之指向結(jié)構(gòu)體變量(或結(jié)構(gòu)數(shù)組元素)的某一成員。 9.4 指向結(jié)構(gòu)體類(lèi)型數(shù)據(jù)的指針例9.5使用指向結(jié)構(gòu)數(shù)組的指針來(lái)訪問(wèn)結(jié)構(gòu)數(shù)組。 #include “struct.h”/*定義并初始化一個(gè)外部結(jié)構(gòu)數(shù)組student */struct student student23=“000102”,”Zhangsan”,”nan”,1990,5,20, “000105”,”Lisi”,”nan”,1990,9,15, “000112”,”Wangwu”,”nv”,1990,3,10 ;void main() struct
12、student *pointer=student2; /*沒(méi)有使用取地址運(yùn)算符”&”*/ int i; /*打印表頭*/ printf(No. Name Sex Birthdayn); /*輸出結(jié)構(gòu)數(shù)組內(nèi)容*/ for(i=0 ; ino, pointer-name, pointer-sex); printf(“%4d-%2d-%2dn”, pointer-birthday.year, pointer-birthday.month, pointer-birthday.day); 9.4 指向結(jié)構(gòu)體類(lèi)型數(shù)據(jù)的指針9.4.3 指向結(jié)構(gòu)數(shù)據(jù)的指針作函數(shù)參數(shù)指向結(jié)構(gòu)體的指針變量與普通指針變量一樣既可以
13、作為函數(shù)的形參,也可以作函數(shù)的實(shí)參。被調(diào)用函數(shù)雖然不能改變實(shí)參指針變量的值,但可以改變實(shí)參指針變量所指向的結(jié)構(gòu)體變量的值。例9.6 用函數(shù)調(diào)用方式,改寫(xiě)例9.5:編寫(xiě)一個(gè)專(zhuān)門(mén)的顯示函數(shù)display(),通過(guò)主函數(shù)調(diào)用來(lái)實(shí)現(xiàn)顯示。 9.5 用typedef定義已有類(lèi)型的別名typedef與#define有相似之處,但二者是不同的:前者是由編譯器在編譯時(shí)處理的;后者是由編譯預(yù)處理器在編譯預(yù)處理時(shí)處理的,而且只能作簡(jiǎn)單的字符串替換。定義已有類(lèi)型別名的方法如下:(1)按定義變量的方法,寫(xiě)出定義體;(2)將變量名換成別名;(3)在定義體最前面加上typedef。9.5 用typedef定義已有類(lèi)型的別
14、名例9.7 給實(shí)型float定義1個(gè)別名REAL。 typedef float REAL;void main() float f=12.3; REAL r=23.4; printf(“float f=%fn”,f); printf(“REAL r=%fn”,r); 9.5 用typedef定義已有類(lèi)型的別名例9.8對(duì)結(jié)構(gòu)體數(shù)組以姓名作為關(guān)鍵字按字母表順序排序程序運(yùn)行結(jié)果:Before sort:No. Name Sex Birthday000102 Zhangsan nan 1990- 5-20000105 Lisi nan 1990- 9-15000112 Wangwu nv 1990- 3
15、-10After sort:No. Name Sex Birthday000105 Lisi nan 1990- 9-15000112 Wangwu nv 1990- 3-10000102 Zhangsan nan 1990- 5-209.6 鏈表處理結(jié)構(gòu)指針的應(yīng)用9.6.1鏈表結(jié)構(gòu)一個(gè)單鏈表有若干個(gè)相同的節(jié)點(diǎn)組成,每個(gè)結(jié)點(diǎn)由2個(gè)部分組成: 數(shù)據(jù)域:存儲(chǔ)結(jié)點(diǎn)本身的信息。 指針域:指向后繼結(jié)點(diǎn)的指針。第一個(gè)叫表頭結(jié)點(diǎn),表頭節(jié)點(diǎn)一般不存放數(shù)據(jù);最后一個(gè)叫尾節(jié)點(diǎn),尾結(jié)點(diǎn)的指針域置為”NULL(空)”,作為鏈表結(jié)束的標(biāo)志。9.6 鏈表處理結(jié)構(gòu)指針的應(yīng)用9.6.2 創(chuàng)建一個(gè)新鏈表9.6.3 對(duì)鏈表的插入
16、操作9.6.4 對(duì)鏈表的刪除操作9.7 共用體和枚舉類(lèi)型9.7.1 共用體使幾個(gè)不同的變量占用同一段內(nèi)存空間的結(jié)構(gòu)稱為共用體或聯(lián)合體。定義與結(jié)構(gòu)體類(lèi)型的定義類(lèi)似 union 共用類(lèi)型名 成員列表; 9.7 共用體和枚舉類(lèi)型3共用變量的定義與結(jié)構(gòu)體變量的定義類(lèi)似(1)間接定義先定義類(lèi)型、再定義變量例如,定義data共用類(lèi)型變量un1,un2,un3的語(yǔ)句如下: union data un1,un2,un3;(2)直接定義定義類(lèi)型的同時(shí)定義變量例如,union data int i; char ch; float f; un1, un2, un3; 9.7 共用體和枚舉類(lèi)型共用變量占用的內(nèi)存空間,
17、等于最長(zhǎng)成員的長(zhǎng)度,而不是各成員長(zhǎng)度之和。例如,共用變量un1、un2和un3,在16位操作系統(tǒng)中,占用的內(nèi)存空間均為字節(jié)(不是2+1+4=7字節(jié))。 共用變量的引用與結(jié)構(gòu)體變量一樣,也只能逐個(gè)引用共用變量的成員。例如,訪問(wèn)共用變量un1各成員的格式為:un1.i、un1.ch、un1.f。 9.7 共用體和枚舉類(lèi)型特點(diǎn)(1)系統(tǒng)采用覆蓋技術(shù),實(shí)現(xiàn)共用變量各成員的內(nèi)存共享,所以在某一時(shí)刻,存放的和起作用的是最后一次存入的成員值。例如,執(zhí)行un1.i=1, un1.ch=c, un1.f=3.14后,un1.f才是有效的成員。(2)由于所有成員共享同一內(nèi)存空間,故共用變量與其各成員的地址相同。例
18、如,un1un1.iun1.chun1.f。(3)不能對(duì)共用變量進(jìn)行初始化(注意:結(jié)構(gòu)體變量可以);也不能將共用變量作為函數(shù)參數(shù),以及使函數(shù)返回一個(gè)共用數(shù)據(jù),但可以使用指向共用變量的指針。(4)共用類(lèi)型可以出現(xiàn)在結(jié)構(gòu)體類(lèi)型定義中,反之亦然。 9.7 共用體和枚舉類(lèi)型9.7.2 枚舉類(lèi)型如果一個(gè)變量的值只有幾種可能,我們就可以用枚舉類(lèi)型來(lái)表示。就是將變量的值限制在枚舉出來(lái)的幾個(gè)值范圍內(nèi),如果給它賦予了一個(gè)其它的值,就會(huì)出現(xiàn)錯(cuò)誤提示,便于檢查。1枚舉類(lèi)型的定義 enum 枚舉類(lèi)型名 取值表;例如,enum weekdays Sun,Mon,Tue,Wed,Thu,Fri,Sat; 9.7 共用體和枚舉類(lèi)型枚舉變量的定義與結(jié)構(gòu)體變量類(lèi)似(1)間接定義例如,enum weekdays workday;(2)直接定義例如,enum weekdays Sun,Mon,Tue,Wed,Thu,Fri,Sat workday; 9.7 共用體和枚舉類(lèi)型說(shuō)明(1)枚舉類(lèi)型僅適應(yīng)于取值有限的數(shù)
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 聯(lián)網(wǎng)報(bào)警服務(wù)合同范例
- 水庫(kù)改造施工合同范例
- 4s店買(mǎi)賣(mài)合同范例
- 務(wù)工合同范例建筑
- 米油鹽購(gòu)銷(xiāo)合同范例
- 蓋板合同范例
- 交運(yùn)股合同范例
- 喜相逢購(gòu)車(chē)合同范例
- 銅陵學(xué)院《機(jī)械優(yōu)化設(shè)計(jì)及應(yīng)用》2023-2024學(xué)年第一學(xué)期期末試卷
- 通化醫(yī)藥健康職業(yè)學(xué)院《痕跡信息系統(tǒng)應(yīng)用》2023-2024學(xué)年第一學(xué)期期末試卷
- 人教版小學(xué)二年級(jí)上冊(cè)音樂(lè)教材分析
- 出院患者隨訪登記表
- GB/T 5195.2-2006螢石碳酸鹽含量的測(cè)定
- GB/T 242-2007金屬管擴(kuò)口試驗(yàn)方法
- GB/T 20878-2007不銹鋼和耐熱鋼牌號(hào)及化學(xué)成分
- 政教主任校會(huì)講話稿(三)
- 湖南省家庭經(jīng)濟(jì)困難學(xué)生認(rèn)定申請(qǐng)表
- 陸游-(生平)知識(shí)講解課件
- 外研版四年級(jí)英語(yǔ)下冊(cè)全冊(cè)復(fù)習(xí)教案
- 臨床試驗(yàn)方案模板
- 醫(yī)療糾紛預(yù)防和處理?xiàng)l例相關(guān)知識(shí)考核試題及答案
評(píng)論
0/150
提交評(píng)論