C語言電子教案第9章__結(jié)構(gòu)體與共用體課件_第1頁
C語言電子教案第9章__結(jié)構(gòu)體與共用體課件_第2頁
C語言電子教案第9章__結(jié)構(gòu)體與共用體課件_第3頁
C語言電子教案第9章__結(jié)構(gòu)體與共用體課件_第4頁
C語言電子教案第9章__結(jié)構(gòu)體與共用體課件_第5頁
已閱讀5頁,還剩26頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、第9章 結(jié)構(gòu)體與共用體 1.理解數(shù)組、結(jié)構(gòu)體、共用體的區(qū)別;2.掌握結(jié)構(gòu)體定義和成員引用的方法;3.學(xué)會利用指針靈活地處理結(jié)構(gòu)體數(shù)據(jù);4.掌握結(jié)構(gòu)體數(shù)組的處理方法;5.掌握鏈表的概念和處理方法。 第9章 結(jié)構(gòu)體與共用體 9.1 結(jié)構(gòu)體類型與結(jié)構(gòu)體變量的定義 9.2 結(jié)構(gòu)體變量的引用與初始化9.3 結(jié)構(gòu)體數(shù)組9.4 指向結(jié)構(gòu)體類型數(shù)據(jù)的指針9.5 用typedef定義已有類型的別名9.6 鏈表處理結(jié)構(gòu)指針的應(yīng)用 9.7 共用體和枚舉類型9.1 結(jié)構(gòu)體類型與結(jié)構(gòu)體變量的定義結(jié)構(gòu)體類型,是一種復(fù)合的數(shù)據(jù)類型,相當(dāng)于其它高級語言或數(shù)據(jù)庫中的”記錄”類型,也可以當(dāng)作是面向?qū)ο蟪绦蛟O(shè)計中類結(jié)構(gòu)的原始模型。

2、 定義結(jié)構(gòu)體是用struct關(guān)鍵字和一組定義各種數(shù)據(jù)段的語句塊的組合體,方式如下: struct 結(jié)構(gòu)體類型名 /* struct是結(jié)構(gòu)體類型關(guān)鍵字*/ 數(shù)據(jù)類型 數(shù)據(jù)項1; 數(shù)據(jù)類型 數(shù)據(jù)項2; 數(shù)據(jù)類型 數(shù)據(jù)項; ; 9.1 結(jié)構(gòu)體類型與結(jié)構(gòu)體變量的定義定義一個存儲日期的結(jié)構(gòu)體類型:struct date /*日期結(jié)構(gòu)體類型:由年、月、日三項組成*/ int year; int month; int day;在定義結(jié)構(gòu)體時,一定要注意在最后加一個分號?!敖Y(jié)構(gòu)體類型名”和”數(shù)據(jù)項”的命名規(guī)則,與一般變量名相同。數(shù)據(jù)類型相同的數(shù)據(jù)項,既可逐個、逐行分別定義,也可合并成一行定義。9.1 結(jié)構(gòu)體類

3、型與結(jié)構(gòu)體變量的定義結(jié)構(gòu)體類型中的數(shù)據(jù)項的定義十分靈活。既可以是基本數(shù)據(jù)類型,又可以是數(shù)組,還允許是另一個已經(jīng)定義的結(jié)構(gòu)體類型。例如定義一個包含學(xué)生信息的結(jié)構(gòu)體類型:struct student char no7; char name9; char sex4; struct date birthday; 變量內(nèi)存地址noFFDCnameFFE3sexFFECbirthday.yearFFF0birthday.monthFFF2birthday.dayFFF49.1 結(jié)構(gòu)體類型與結(jié)構(gòu)體變量的定義9.1.2 結(jié)構(gòu)體變量定義用戶自己定義的結(jié)構(gòu)體類型,與系統(tǒng)定義的標(biāo)準(zhǔn)類型(int、char等)一樣,可

4、用來定義結(jié)構(gòu)體變量的類型。結(jié)構(gòu)體變量的定義方式有兩種:(1)間接定義法:先定義結(jié)構(gòu)體類型、再定義結(jié)構(gòu)體變量結(jié)構(gòu)體變量的類型名有兩部分組成:一是關(guān)鍵字struct;二是程序員定義的結(jié)構(gòu)體名,一般形式為:struct 結(jié)構(gòu)體名 結(jié)構(gòu)體變量名 9.1 結(jié)構(gòu)體類型與結(jié)構(gòu)體變量的定義(2)直接定義法:在定義結(jié)構(gòu)體類型的同時,定義結(jié)構(gòu)體變量同時定義結(jié)構(gòu)體類型及其結(jié)構(gòu)體變量的一般格式如下: struct 結(jié)構(gòu)體類型名 結(jié)構(gòu)體變量表;要是定義多個??梢杂枚禾柋磉_式分開。 9.2 結(jié)構(gòu)體變量的引用與初始化9.2.1結(jié)構(gòu)體變量的引用規(guī)則結(jié)構(gòu)體類型變量的各成員不能用結(jié)構(gòu)體名一起引用,必須單獨引用,成員運算符”.”具

5、有最高優(yōu)先級。對于結(jié)構(gòu)體變量,要通過成員運算符”.”,逐個訪問其成員,且訪問的格式為:結(jié)構(gòu)體變量.成員 /*其中的”.”是成員運算符*/要引用結(jié)構(gòu)體變量student1中的學(xué)號no,可以用student1.no來表示;表示的意思是引用結(jié)構(gòu)體變量student1中的name成員,等等。 9.2 結(jié)構(gòu)體變量的引用與初始化如果結(jié)構(gòu)體成員本身又是結(jié)構(gòu)體類型的,則可繼續(xù)使用成員運算符取結(jié)構(gòu)體成員的結(jié)構(gòu)體成員,逐級向下,引用最低一級的成員。程序只能對最低一級的成員進行運算。此時的引用格式擴展為: 結(jié)構(gòu)體變量.成員.子成員.最低1級子成員例如,引用結(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ù)類型,應(yīng)與結(jié)構(gòu)體變量中相應(yīng)成員所要求的一致,否則會出錯。如果某成員本身又是結(jié)構(gòu)體類型,則該成員的初值為一個初值表。例如:student1=“000102”, “Zhangsan”, “nan”, 1990,9,20。必須按結(jié)構(gòu)體定義的順序賦值。不要顛倒了。 9.2 結(jié)構(gòu)體變量的引用與初始化例9.2 利用例9.1中定義的結(jié)構(gòu)體類型頭文件,定義一個結(jié)構(gòu)體變量student1,用于存儲和顯示一個

7、學(xué)生的基本情況。 程序運行結(jié)果:No: 000102Name: ZhangsanSex: nanBirthday:1990-9-20 9.3 結(jié)構(gòu)體數(shù)組結(jié)構(gòu)體數(shù)組的每一個元素,都是結(jié)構(gòu)體類型數(shù)據(jù),均包含結(jié)構(gòu)體類型的所有成員。與結(jié)構(gòu)體變量的定義相似,結(jié)構(gòu)體數(shù)組的定義也分直接定義和間接定義兩種方法,只需用下標(biāo)運算符”說明為數(shù)組即可。與普通數(shù)組一樣,結(jié)構(gòu)數(shù)組也可在定義時進行初始化。初始化的格式為: 結(jié)構(gòu)體數(shù)組n初值表1,初值表2,.,初值表n 9.3 結(jié)構(gòu)體數(shù)組例9.3 利用例9.1中定義的結(jié)構(gòu)體類型struct student,定義一個結(jié)構(gòu)數(shù)組student2,用于存儲和顯示三個學(xué)生的基本情況。

8、程序運行結(jié)果:No. Name Sex Birthday000102 Zhangsan nan 1990-9-20000105 Lisi nan 1990-9-15000112 Wangwu nv 1990-3-109.4 指向結(jié)構(gòu)體類型數(shù)據(jù)的指針結(jié)構(gòu)體變量在內(nèi)存中的起始地址稱為結(jié)構(gòu)體變量的指針。與結(jié)構(gòu)體變量的定義相似,指向結(jié)構(gòu)體變量的指針的定義也分直接定義和間接定義兩種方法,只需在指針變量前加指針運算符”*”說明為指針即可。例如:struct student *pointer 9.4 指向結(jié)構(gòu)體類型數(shù)據(jù)的指針通過指向結(jié)構(gòu)體變量的指針來訪問結(jié)構(gòu)體變量的成員,與直接使用結(jié)構(gòu)體變量的效果一樣。一般

9、地說,如果指針變量pointer已指向結(jié)構(gòu)體變量student1(pointer=&student1),則以下三種形式等價:(1)student1.成員(2)pointer-成員 /*”-“為指向運算符*/(3)(*pointer).成員 /* “*pointer”外面的括號不能??!*/ 9.4 指向結(jié)構(gòu)體類型數(shù)據(jù)的指針例9.4 使用指向結(jié)構(gòu)體變量的指針來訪問結(jié)構(gòu)體變量的各個成員。 #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)體類型數(shù)據(jù)的指針9.4.2 指向結(jié)構(gòu)數(shù)組的指針如果指針變量pointer已指向某結(jié)構(gòu)數(shù)組,則pointer +1指向結(jié)構(gòu)數(shù)組的下一個元素,而不是當(dāng)前元素的下一個

11、成員。另外,如果指針變量pointer已經(jīng)指向一個結(jié)構(gòu)體變量(或結(jié)構(gòu)數(shù)組),就不能再使之指向結(jié)構(gòu)體變量(或結(jié)構(gòu)數(shù)組元素)的某一成員。 9.4 指向結(jié)構(gòu)體類型數(shù)據(jù)的指針例9.5使用指向結(jié)構(gòu)數(shù)組的指針來訪問結(jié)構(gòu)數(shù)組。 #include “struct.h”/*定義并初始化一個外部結(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; /*沒有使用取地址運算符”&”*/ 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)體類型數(shù)據(jù)的指針9.4.3 指向結(jié)構(gòu)數(shù)據(jù)的指針作函數(shù)參數(shù)指向結(jié)構(gòu)體的指針變量與普通指針變量一樣既可以

13、作為函數(shù)的形參,也可以作函數(shù)的實參。被調(diào)用函數(shù)雖然不能改變實參指針變量的值,但可以改變實參指針變量所指向的結(jié)構(gòu)體變量的值。例9.6 用函數(shù)調(diào)用方式,改寫例9.5:編寫一個專門的顯示函數(shù)display(),通過主函數(shù)調(diào)用來實現(xiàn)顯示。 9.5 用typedef定義已有類型的別名typedef與#define有相似之處,但二者是不同的:前者是由編譯器在編譯時處理的;后者是由編譯預(yù)處理器在編譯預(yù)處理時處理的,而且只能作簡單的字符串替換。定義已有類型別名的方法如下:(1)按定義變量的方法,寫出定義體;(2)將變量名換成別名;(3)在定義體最前面加上typedef。9.5 用typedef定義已有類型的別

14、名例9.7 給實型float定義1個別名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定義已有類型的別名例9.8對結(jié)構(gòu)體數(shù)組以姓名作為關(guā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)一個單鏈表有若干個相同的節(jié)點組成,每個結(jié)點由2個部分組成: 數(shù)據(jù)域:存儲結(jié)點本身的信息。 指針域:指向后繼結(jié)點的指針。第一個叫表頭結(jié)點,表頭節(jié)點一般不存放數(shù)據(jù);最后一個叫尾節(jié)點,尾結(jié)點的指針域置為”NULL(空)”,作為鏈表結(jié)束的標(biāo)志。9.6 鏈表處理結(jié)構(gòu)指針的應(yīng)用9.6.2 創(chuàng)建一個新鏈表9.6.3 對鏈表的插入

16、操作9.6.4 對鏈表的刪除操作9.7 共用體和枚舉類型9.7.1 共用體使幾個不同的變量占用同一段內(nèi)存空間的結(jié)構(gòu)稱為共用體或聯(lián)合體。定義與結(jié)構(gòu)體類型的定義類似 union 共用類型名 成員列表; 9.7 共用體和枚舉類型3共用變量的定義與結(jié)構(gòu)體變量的定義類似(1)間接定義先定義類型、再定義變量例如,定義data共用類型變量un1,un2,un3的語句如下: union data un1,un2,un3;(2)直接定義定義類型的同時定義變量例如,union data int i; char ch; float f; un1, un2, un3; 9.7 共用體和枚舉類型共用變量占用的內(nèi)存空間,

17、等于最長成員的長度,而不是各成員長度之和。例如,共用變量un1、un2和un3,在16位操作系統(tǒng)中,占用的內(nèi)存空間均為字節(jié)(不是2+1+4=7字節(jié))。 共用變量的引用與結(jié)構(gòu)體變量一樣,也只能逐個引用共用變量的成員。例如,訪問共用變量un1各成員的格式為:un1.i、un1.ch、un1.f。 9.7 共用體和枚舉類型特點(1)系統(tǒng)采用覆蓋技術(shù),實現(xiàn)共用變量各成員的內(nèi)存共享,所以在某一時刻,存放的和起作用的是最后一次存入的成員值。例如,執(zhí)行un1.i=1, un1.ch=c, un1.f=3.14后,un1.f才是有效的成員。(2)由于所有成員共享同一內(nèi)存空間,故共用變量與其各成員的地址相同。例

18、如,un1un1.iun1.chun1.f。(3)不能對共用變量進行初始化(注意:結(jié)構(gòu)體變量可以);也不能將共用變量作為函數(shù)參數(shù),以及使函數(shù)返回一個共用數(shù)據(jù),但可以使用指向共用變量的指針。(4)共用類型可以出現(xiàn)在結(jié)構(gòu)體類型定義中,反之亦然。 9.7 共用體和枚舉類型9.7.2 枚舉類型如果一個變量的值只有幾種可能,我們就可以用枚舉類型來表示。就是將變量的值限制在枚舉出來的幾個值范圍內(nèi),如果給它賦予了一個其它的值,就會出現(xiàn)錯誤提示,便于檢查。1枚舉類型的定義 enum 枚舉類型名 取值表;例如,enum weekdays Sun,Mon,Tue,Wed,Thu,Fri,Sat; 9.7 共用體和枚舉類型枚舉變量的定義與結(jié)構(gòu)體變量類似(1)間接定義例如,enum weekdays workday;(2)直接定義例如,enum weekdays Sun,Mon,Tue,Wed,Thu,Fri,Sat workday; 9.7 共用體和枚舉類型說明(1)枚舉類型僅適應(yīng)于取值有限的數(shù)

溫馨提示

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

最新文檔

評論

0/150

提交評論