




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、第12章 結(jié)構(gòu)體與共用體,哈爾濱工業(yè)大學 計算機科學與技術(shù)學院 蘇小紅 sxh,本章學習內(nèi)容, 結(jié)構(gòu)體數(shù)據(jù)類型,共用體數(shù)據(jù)類型、枚舉數(shù)據(jù)類型、定義數(shù)據(jù)類型的別名 結(jié)構(gòu)體變量、結(jié)構(gòu)體數(shù)組、結(jié)構(gòu)體指針的定義和初始化 結(jié)構(gòu)體成員的引用、成員選擇運算符、指向運算符 向函數(shù)傳遞結(jié)構(gòu)體變量、結(jié)構(gòu)體數(shù)組、結(jié)構(gòu)體指針 動態(tài)數(shù)據(jù)結(jié)構(gòu)、動態(tài)鏈表,二進制數(shù)類型本不存在 內(nèi)存里存的內(nèi)容,你認為它是什么,它就是什么 在早期的機器指令及匯編語言中,數(shù)據(jù)對象均用二進制數(shù)表示,沒有類型的概念 一般的CPU只支持兩種類型 整數(shù)、浮點數(shù),12.1從基本數(shù)據(jù)類型到抽象數(shù)據(jù)類型,在高級語言引入了基本數(shù)據(jù)類型 整型、浮點型、字符型等
2、不同語言會定義不同的基本類型 基本數(shù)據(jù)類型并不能方便地解決所有問題 有些語言(如PL/1)中試圖規(guī)定較多的類型,如數(shù)組、樹、棧等,但實踐證明不是個好辦法,12.1從基本數(shù)據(jù)類型到抽象數(shù)據(jù)類型,用戶自己構(gòu)造數(shù)據(jù)類型復合數(shù)據(jù)類型 由基本數(shù)據(jù)類型迭代派生而來,表示復雜的數(shù)據(jù)對象 典型的代表就是“結(jié)構(gòu)體” 抽象數(shù)據(jù)類型(Abstract Data Type,ADT) 在復合數(shù)據(jù)類型基礎(chǔ)上增加了對數(shù)據(jù)的操作 抽象數(shù)據(jù)類型進而進化為“類(Class)” 這是一個跨時代的進步 Class是Object-Oriented的一個重要概念,12.1從基本數(shù)據(jù)類型到抽象數(shù)據(jù)類型,12.2 結(jié)構(gòu)體的定義 12.2.1
3、為什么要定義結(jié)構(gòu)體類型,在程序里表示一個人(姓名、年齡、性別),怎么表示? 想表示多個人呢? 如何用計算機程序?qū)崿F(xiàn)下述表格的管理?,數(shù)組的解決方法,數(shù)組的解決方法,數(shù)據(jù)的內(nèi)存管理方式,數(shù)組的解決方法,分配內(nèi)存不集中,尋址效率不高 對數(shù)組賦初值時,易發(fā)生錯位 結(jié)構(gòu)顯得零散,不易管理,希望的內(nèi)存分配圖,結(jié)構(gòu)體類型的聲明,聲明了一個結(jié)構(gòu)體類型,構(gòu)成結(jié)構(gòu)體的變量稱為結(jié)構(gòu)體的成員(Structure Member),結(jié)構(gòu)體的名字稱為結(jié)構(gòu)體標簽(Structure Tag),結(jié)構(gòu)體類型的聲明,結(jié)構(gòu)體模板(Structure Template),Dont forget the semicolon!,形成一個
4、類型聲明的樣板 用于生成結(jié)構(gòu)體變量 但并未聲明結(jié)構(gòu)體變量 因而編譯器不為其分配內(nèi)存,(1)先定義結(jié)構(gòu)體類型,再定義變量名,(2)在定義類型的同時定義變量,(3)直接定義結(jié)構(gòu)體變量(不指定結(jié)構(gòu)體標簽),12.2.2結(jié)構(gòu)體變量的定義,12.2.3用typedef定義數(shù)據(jù)類型,struct student stu1, stu2;/*It works*/ student stu1, stu2; /*Can this work?*/ struct stu1, stu2; /*Can this work?*/ STUDENT stu1, stu2; /*It works!*/,關(guān)鍵字typedef為一種已
5、存在的類型定義一個別名,并未定義新類型,STUDENT與struct student類型是同義詞,等價于,12.2.4結(jié)構(gòu)體變量的初始化,等價于,注意!,嵌套的結(jié)構(gòu)體(Nested Structure)就是在一個結(jié)構(gòu)體內(nèi)包含了另一個結(jié)構(gòu)體作為其成員,12.2.5嵌套的結(jié)構(gòu)體,結(jié)構(gòu)體定義 可以嵌套,訪問結(jié)構(gòu)體變量的成員必須使用成員選擇運算符(也稱圓點運算符),12.2.6結(jié)構(gòu)體變量的引用,當出現(xiàn)結(jié)構(gòu)體嵌套時,必須以級聯(lián)方式訪問結(jié)構(gòu)體成員,【例12.1】演示結(jié)構(gòu)體變量的賦值和引用方法,12.2.6結(jié)構(gòu)體變量的引用,按結(jié)構(gòu)體的成員順序逐一對相應(yīng)成員進行賦值,格式符%02d中2d前面的前導符0表示輸出
6、數(shù)據(jù)時,若左邊有多余位,則補0,【例12.1】若要從鍵盤輸入結(jié)構(gòu)體變量stu1的內(nèi)容,那么程序如何修改?,兩個地址有何不同?,【例12.1】若要從鍵盤輸入結(jié)構(gòu)體變量stu1的內(nèi)容,那么程序如何修改?,結(jié)構(gòu)體成員的地址與該成員在結(jié)構(gòu)體中所處的位置及其所占內(nèi)存的字節(jié)數(shù)相關(guān),結(jié)構(gòu)體變量的地址,用運算符sizeof獲得結(jié)構(gòu)體大小 sizeof(變量或表達式) sizeof(類型),12,Why?,printf(%dn, sizeof(SAMPLE);,【例12.2】,12.2.7結(jié)構(gòu)體所占內(nèi)存的字節(jié)數(shù),事實上,所有數(shù)據(jù)類型在內(nèi)存中都是從偶數(shù)地址開始存放的 且結(jié)構(gòu)所占的實際空間一般是按照機器字長對齊的
7、不同的編譯器、平臺,對齊方式會有變化 結(jié)構(gòu)體變量的成員的存儲對齊規(guī)則是與機器相關(guān)的 具有特定數(shù)據(jù)類型的數(shù)據(jù)項大小也是與機器相關(guān)的 所以一個結(jié)構(gòu)體在內(nèi)存中的存儲格式也是與機器相關(guān)的,非所有成員變量的內(nèi)存總和,12個字節(jié),12.3結(jié)構(gòu)體數(shù)組的定義和初始化,12.3結(jié)構(gòu)體數(shù)組的定義和初始化,建立了數(shù)據(jù)庫中的多條記錄,每條對應(yīng)一個學生信息,【例12.3】利用結(jié)構(gòu)體數(shù)組計算每個學生的平均分,12.4結(jié)構(gòu)體指針的定義和初始化,pt,stu1,STUDENT stu1; STUDENT *pt; pt = ,如何定義指向結(jié)構(gòu)體變量的指針?,STUDENT *pt = ,等價于,12.4結(jié)構(gòu)體指針的定義和初始
8、化,如何訪問結(jié)構(gòu)體指針變量所指向的結(jié)構(gòu)體成員呢?,STUDENT stu1; STUDENT *pt = ,pt,stu1,通過stu1和成員選擇運算符訪問結(jié)構(gòu)體成員 stu1. studentID = 1; 通過pt和指向運算符訪問結(jié)構(gòu)體成員 (*pt). studentID = 1; pt - studentID = 1;,12.4結(jié)構(gòu)體指針的定義和初始化,pt,stu1,當結(jié)構(gòu)體嵌套時,如何訪問結(jié)構(gòu)體指針變量所指向的結(jié)構(gòu)體成員?,stu1. birthday. year = 1999; (*pt). birthday. year = 1999; pt - birthday. year =
9、 1999;,STUDENT stu1; STUDENT *pt = ,12.4結(jié)構(gòu)體指針的定義和初始化,STUDENT stu30; STUDENT *pt; pt = stu;,如何定義指向結(jié)構(gòu)體數(shù)組的指針?,STUDENT *pt = stu;,等價于,STUDENT *pt = ,等價于,pt,stu30,使用pt+,使pt指向stu1 pt - studentID 等價于 stu1. studentID,pt,12.4結(jié)構(gòu)體指針的定義和初始化,STUDENT stu30; STUDENT *pt = stu;,如何訪問結(jié)構(gòu)體數(shù)組指針指向的結(jié)構(gòu)體成員?,stu30,12.5向函數(shù)傳遞結(jié)
10、構(gòu)體,向函數(shù)傳遞結(jié)構(gòu)體的單個成員 復制單個成員的內(nèi)容 函數(shù)內(nèi)對結(jié)構(gòu)內(nèi)容的修改不影響原結(jié)構(gòu) 向函數(shù)傳遞結(jié)構(gòu)體的完整結(jié)構(gòu) 向函數(shù)傳遞結(jié)構(gòu)體的首地址,struct date int year; int month; int day; ; void Func(struct date p) p.year = 2000; p.month = 5; p.day = 22; ,Before function call:1999/04/23,After function call:1999/04/23,結(jié)構(gòu)體變量 作函數(shù)參數(shù),【例12.4】,struct date int year; int month; in
11、t day; ; void Func(struct date *p) p-year = 2000; p-month = 5; p-day = 22; ,Before function call:1999/04/23,After function call:2000/05/22,結(jié)構(gòu)體指針 作函數(shù)參數(shù),指針作函數(shù)形參 實參必須為地址值,【例12.5】,struct date int year; int month; int day; ; struct date Func(struct date p) p.year = 2000; p.month = 5; p.day = 22; return p
12、; ,Before function call:1999/04/23,After function call:2000/05/22,結(jié)構(gòu)體變量 作函數(shù)返回值,【例12.6】,12.5向函數(shù)傳遞結(jié)構(gòu)體,向函數(shù)傳遞結(jié)構(gòu)體的完整結(jié)構(gòu) 復制整個結(jié)構(gòu)體成員的內(nèi)容,多個值 函數(shù)內(nèi)對結(jié)構(gòu)內(nèi)容的修改不影響原結(jié)構(gòu) 內(nèi)容傳遞更直觀,但開銷大 向函數(shù)傳遞結(jié)構(gòu)體的首地址 用結(jié)構(gòu)體數(shù)組/結(jié)構(gòu)體指針作函數(shù)參數(shù) 僅復制結(jié)構(gòu)體的首地址,一個值 修改結(jié)構(gòu)體指針所指向的結(jié)構(gòu)體的內(nèi)容 指針傳遞效率高,12.5向函數(shù)傳遞結(jié)構(gòu)體,【例12.7】修改例12.3程序,用結(jié)構(gòu)體數(shù)組作函數(shù)參數(shù)編程并輸出計算學生的平均分,12.5向函數(shù)傳遞結(jié)構(gòu)
13、體,【例12.7】修改例12.3程序,用結(jié)構(gòu)體數(shù)組作函數(shù)參數(shù)編程并輸出計算學生的平均分,12.5向函數(shù)傳遞結(jié)構(gòu)體,【例12.7】修改例12.3程序,用結(jié)構(gòu)體數(shù)組作函數(shù)參數(shù)編程并輸出計算學生的平均分,12.5向函數(shù)傳遞結(jié)構(gòu)體,【例12.7】修改例12.3程序,用結(jié)構(gòu)體數(shù)組作函數(shù)參數(shù),編程并輸出計算學生的平均分,用戶自定義的數(shù)據(jù)類型,結(jié)構(gòu)體(Struct) 把關(guān)系緊密且邏輯相關(guān)的多種不同類型的變量,組織到統(tǒng)一的名字之下 占用相鄰的一段內(nèi)存單元 共用體,也稱聯(lián)合(Union) 把情形互斥但邏輯相關(guān)的多種不同類型的變量,組織到統(tǒng)一的名字之下 占用同一段內(nèi)存單元,每一時刻只有一個數(shù)據(jù)起作用,12.6共用
14、體,struct sample short i; char ch; float f; ;,union sample short i; char ch; float f; ;,printf(%dn, sizeof(struct sample);,8個字節(jié),i,ch,f,4個字節(jié),printf(%dn, sizeof(union sample);,【例12.8】,12.6共用體,sizeof(union number)取決于占空間最多的那個成員變量,同一內(nèi)存單元在每一瞬時只能存放其中一種類型的成員 起作用的成員是最后一次存放的成員,不能作為函數(shù)參數(shù) 不能進行比較操作,只能對第一個成員初始化,f,4
15、個字節(jié),12.6共用體,12.6共用體,12.7 枚舉數(shù)據(jù)類型,枚舉(Enumeration)數(shù)據(jù)類型 描述的是一組整型值的集合 用于當某些量僅由有限個數(shù)據(jù)值組成時 enum weeks SUN, MON, TUE, WED, THU, FRI, SAT; enum weeks today; enum response no, yes, none; enum response answer; today = TUE; answer = yes; enum response no = -1, yes = 1, none = 0;,其值為2,其值為1,下面的結(jié)構(gòu)是什么意思? struct temp
16、 int data; struct temp pt; ; CB下的錯誤提示: field pt has incomplete type VC下的錯誤提示: pt uses undefined struct temp 下面的結(jié)構(gòu)是什么意思呢? struct temp int data; struct temp *pt; ;,可包含指向本結(jié)構(gòu)體類型的指針變量,問題的提出,12.8 動態(tài)數(shù)據(jù)結(jié)構(gòu) 單向鏈表,struct Link int data; struct Link *next; ;,鏈表(Linked Table):線性表的鏈式存儲結(jié)構(gòu) 特點:用一組任意的存儲單元存儲線性表的數(shù)據(jù);存儲單元可
17、以是連續(xù)的,也可是不連續(xù)的,鏈表的定義,鏈表(Linked table):線性表的鏈式存儲結(jié)構(gòu) 為表示每個元素與后繼元素的邏輯關(guān)系,除存儲元素本身信息外,還要存儲其直接后繼信息,兩部分信息組成一個節(jié)點,struct Link int data; struct Link *next; ;,數(shù)據(jù)域:存儲數(shù)據(jù)元素信息,指針域:存儲直接后繼的節(jié)點信息,鏈表的定義,鏈表(Linked Table):線性表的鏈式存儲結(jié)構(gòu) 為表示每個元素與后繼元素的邏輯關(guān)系,除存儲元素本身信息外,還要存儲其直接后繼信息,struct Link int data; struct Link *next; ;,n個節(jié)點鏈接成一個
18、鏈表(因為只包含一個指針域,故又稱線性鏈表或單向鏈表),鏈表的建立,向鏈表中添加一個新節(jié)點,空指針NULL表示鏈表結(jié)尾,鏈表的頭指針:訪問鏈表的關(guān)鍵,鏈表的建立,若原鏈表為空表(head = NULL) ,則將新建節(jié)點p置為頭節(jié)點,(1)head = p,(2) pr = p,(3) pr-next = NULL,鏈表的建立,若原鏈表為非空,則將新建節(jié)點p添加到表尾,(1) pr-next = p,(2) pr = p,(3) pr-next = NULL,next,鏈表的刪除操作,若原鏈表為空表,則退出程序 若待刪除節(jié)點p是頭節(jié)點,則將head指向當前節(jié)點的下一個節(jié)點即可刪除當前節(jié)點,(1) head = p-next,head,(2) free(p),鏈表的刪除操作,若待刪除節(jié)點不是頭節(jié)點,則將前一節(jié)點的指針域指向當前節(jié)點的下一節(jié)點即可刪除當前節(jié)點,(1) pr-next = p-next,若已搜索到表尾(p-next = NULL)仍未找到待刪除節(jié)點,則顯示“未找到”,(2) free(p),鏈表的插入操作,若原鏈表為空表,則將新節(jié)點p作為頭節(jié)點,讓head指向新節(jié)點p,(1) head = p,p = (struct link *)malloc(sizeof(struct link); p-next = NULL; p-data = nodeData
溫馨提示
- 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)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 專題5.3 平面向量的數(shù)量積(原卷版)-2024年高考數(shù)學一輪復習精講精練寶典(新高考專用)
- 幼兒游戲教學案例
- 人教版(2024)七年級英語下冊Unit 6 學情調(diào)研測試卷(含答案)
- 路基拼寬施工方案
- 隧道風機房施工方案
- 2025年新高考地理全真模擬試卷4(含答案解析)
- 2025年高考地理二輪復習:綜合題答題技巧(含練習題及答案)
- 幕墻防火防雷施工方案
- Unit 6 reading2 教學設(shè)計 2024-2025學年譯林版(2024)七年級英語上冊
- 小學課本劇一年級《小白兔和小灰兔》-劇本
- 高中通用技術(shù)人教高二下冊目錄新型抽紙盒-
- 畜牧場經(jīng)營管理
- 課程思政示范課程申報書(測繪基礎(chǔ))
- ALeader 阿立得 ALD515使用手冊
- 神華陜西國華錦界電廠三期工程環(huán)評報告
- 飛行員航空知識手冊
- GB/Z 19848-2005液壓元件從制造到安裝達到和控制清潔度的指南
- GB/T 34936-2017光伏發(fā)電站匯流箱技術(shù)要求
- GB/T 12618.4-2006開口型平圓頭抽芯鉚釘51級
- 紅金大氣商務(wù)風領(lǐng)導歡迎會PPT通用模板
- 學前教育學00383-歷年真題-試卷
評論
0/150
提交評論