北京科技大學(xué)C語(yǔ)言第7章.ppt
《北京科技大學(xué)C語(yǔ)言第7章.ppt》由會(huì)員分享,可在線閱讀,更多相關(guān)《北京科技大學(xué)C語(yǔ)言第7章.ppt(86頁(yè)珍藏版)》請(qǐng)?jiān)谘b配圖網(wǎng)上搜索。
1 第7章其他自定義數(shù)據(jù)類型 北京科技大學(xué)計(jì)算機(jī)系 C語(yǔ)言程序設(shè)計(jì) 2020 1 27 2 第7章結(jié)構(gòu)體與共用體 主要內(nèi)容7 1構(gòu)造數(shù)據(jù)類型概述7 2結(jié)構(gòu)體類型7 3共用體類型7 4枚舉類型7 5類型重命名7 6案例分析 2020 1 27 3 一個(gè)學(xué)生的信息有學(xué)號(hào) 姓名 性別 年齡 住址 成績(jī)等 一本圖書的信息有分類編號(hào) 書名 作者 出版社 出版日期 價(jià)格 庫(kù)存量等 如何描述這些類型不同的相關(guān)數(shù)據(jù) 7 1構(gòu)造數(shù)據(jù)類型概述 信息管理 結(jié)構(gòu)體 一種構(gòu)造類型數(shù)據(jù)結(jié)構(gòu)體由若干不同類型的數(shù)據(jù)項(xiàng)組成 構(gòu)成結(jié)構(gòu)體的各個(gè)數(shù)據(jù)項(xiàng)稱為結(jié)構(gòu)體成員 2020 1 27 4 struct結(jié)構(gòu)體名 數(shù)據(jù)類型1成員名1 數(shù)據(jù)類型2成員名2 數(shù)據(jù)類型n成員名n 7 2結(jié)構(gòu)體類型 7 2 1結(jié)構(gòu)體與結(jié)構(gòu)體類型的定義 結(jié)構(gòu)體類型定義的一般形式 struct為關(guān)鍵字 結(jié)構(gòu)體名是用戶定義的類型標(biāo)識(shí) 中是組成該結(jié)構(gòu)體的成員 成員的數(shù)據(jù)類型可以是C語(yǔ)言所允許的任何數(shù)據(jù)類型 2020 1 27 5 例如圖書類型的定義 structbookcard charnum 10 圖書分類編號(hào)是字符數(shù)組類型 charname 30 書名是字符數(shù)組類型 charauthor 30 作者是字符數(shù)組類型 charpublisher 60 出版社是字符數(shù)組類型 floatprice 價(jià)格是單精度實(shí)型 intn 庫(kù)存量是整型 7 2結(jié)構(gòu)體類型 7 2 1結(jié)構(gòu)體與結(jié)構(gòu)體類型的定義 2020 1 27 6 例如學(xué)生類型的定義 structstudent charnum 8 學(xué)號(hào)是字符數(shù)組類型 charname 30 姓名是字符數(shù)組類型 charsex 性別是字符型 intage 年齡是整型 charaddr 60 住址是字符數(shù)組類型 intscore 6 成績(jī)是整型數(shù)組類型 7 2結(jié)構(gòu)體類型 7 2 1結(jié)構(gòu)體與結(jié)構(gòu)體類型的定義 2020 1 27 7 7 2結(jié)構(gòu)體類型 7 2 2結(jié)構(gòu)體變量的定義 引用與初始化 1 結(jié)構(gòu)體類型變量的定義 利用已定義的結(jié)構(gòu)體類型名定義變量struct結(jié)構(gòu)體名變量名表 例如 structbookcardbook1 100 structstudents 30 t1 t2 結(jié)構(gòu)體變量的各個(gè)成員在內(nèi)存中占用連續(xù)存儲(chǔ)區(qū)域 結(jié)構(gòu)體變量所占內(nèi)存大小為結(jié)構(gòu)體中每個(gè)成員所占用內(nèi)存的長(zhǎng)度之和 2020 1 27 8 類型與變量是不同的概念 應(yīng)先定義一個(gè)結(jié)構(gòu)體類型 而后再定義結(jié)構(gòu)體變量 系統(tǒng)對(duì)類型不分配空間 僅對(duì)變量分配空間 只能對(duì)變量賦值 存取或運(yùn)算 而不能對(duì)一個(gè)類型賦值 存取或運(yùn)算 成員也可以是結(jié)構(gòu)體變量 對(duì)結(jié)構(gòu)中的成員 可以單獨(dú)使用 它的作用與地位相當(dāng)于普通變量 成員名可與程序中的變量名相同時(shí) 也可與不同結(jié)構(gòu)體類型的成員名相同 二者代表不同的對(duì)象 structdate intyear month day structstudent charnum 8 charname 30 charsex structdatebirthday 成員為結(jié)構(gòu)體類型 charaddr 60 intscore 6 7 2結(jié)構(gòu)體類型 結(jié)構(gòu)體類型與變量的說明 2020 1 27 9 7 2 2結(jié)構(gòu)體變量的定義 引用與初始化 1 結(jié)構(gòu)體類型變量的定義 在定義結(jié)構(gòu)體類型的同時(shí)定義變量 例如 structstudent charnum 8 name 20 sex intage floatscore st 30 struct結(jié)構(gòu)體名 成員定義表 變量名表 2020 1 27 10 1 結(jié)構(gòu)體類型變量的定義 直接定義結(jié)構(gòu)體類型變量 例如 struct charnum 8 name 20 sex intage floatscore st 30 a b c struct 成員定義表 變量名表 7 2 2結(jié)構(gòu)體變量的定義 引用與初始化 2020 1 27 11 2 結(jié)構(gòu)體變量的初始化 例7 4 結(jié)構(gòu)體變量的初始化 structdate intyear month day structstudent charnum 8 name 20 sex structdatebirthday floatscore a 40826011 Liming M 1991 2 9 87 5 b 40826025 Zhangqiang F 1990 5 12 85 c 如果初值個(gè)數(shù)少于結(jié)構(gòu)體成員個(gè)數(shù) 則將無初值對(duì)應(yīng)的成員賦以0值 如果初值個(gè)數(shù)多于結(jié)構(gòu)體成員個(gè)數(shù) 則編譯出錯(cuò) 7 2 2結(jié)構(gòu)體變量的定義 引用與初始化 2020 1 27 12 2 結(jié)構(gòu)體變量的初始化 例7 5 結(jié)構(gòu)體數(shù)組的初始化 structs charnum 8 name 20 sex floatscore stu 3 40826011 Liming M 87 5 40826025 Zhangqiang F 85 40826032 Wangxinping F 90 元素的個(gè)數(shù)可以省略 根據(jù)賦初值時(shí)結(jié)構(gòu)體常量的個(gè)數(shù)確定數(shù)組元素的個(gè)數(shù) 7 2 2結(jié)構(gòu)體變量的定義 引用與初始化 2020 1 27 13 3 結(jié)構(gòu)體變量的運(yùn)算 用sizeof運(yùn)算符計(jì)算結(jié)構(gòu)體變量所占內(nèi)存空間 structdate intyear month day structstudent charnum 8 name 20 sex structdatebirthday floatscore a sizeof a 的結(jié)果為8 20 1 12 4 45sizeof structstudent 的結(jié)果為45 7 2 2結(jié)構(gòu)體變量的定義 引用與初始化 2020 1 27 14 3 結(jié)構(gòu)體變量的運(yùn)算 同類型結(jié)構(gòu)體變量之間的賦值運(yùn)算 結(jié)構(gòu)體變量之間進(jìn)行賦值時(shí) 系統(tǒng)將按成員一一對(duì)應(yīng)賦值 structdate intyear month day structstudent charnum 8 name 20 sex structdatebirthday floatscore a 40826011 Liming M 1977 12 9 87 5 b c c a 7 2 2結(jié)構(gòu)體變量的定義 引用與初始化 2020 1 27 15 3 結(jié)構(gòu)體變量的運(yùn)算 對(duì)結(jié)構(gòu)體變量進(jìn)行取址運(yùn)算 structdate intyear month day structstudent charnum 8 name 20 sex structdatebirthday floatscore a 對(duì)結(jié)構(gòu)體變量a進(jìn)行 a運(yùn)算 可以得到a的首地址 它是結(jié)構(gòu)體類型指針 7 2 2結(jié)構(gòu)體變量的定義 引用與初始化 2020 1 27 16 4 結(jié)構(gòu)體變量成員的引用 結(jié)構(gòu)體變量成員引用的一般形式 結(jié)構(gòu)體變量名 成員名 結(jié)構(gòu)體變量a的各成員可分別表示為a num a name a sex a birthday a score structdate intyear month day structstudent charnum 8 name 20 sex structdatebirthday floatscore a 是分量運(yùn)算符 運(yùn)算級(jí)別最高 a birthday yeara birthday montha birthday day 結(jié)構(gòu)體變量的各個(gè)成員可進(jìn)行何種運(yùn)算 由該成員的數(shù)據(jù)類型決定 7 2 2結(jié)構(gòu)體變量的定義 引用與初始化 2020 1 27 17 例7 6 編寫一個(gè)統(tǒng)計(jì)選票的程序 structcandidate charname 20 name為候選人姓名 intcount count為候選人得票數(shù) list invalid 0 Zhang 0 Wang 0 Li 0 Zhao 0 Liu 0 7 2 2結(jié)構(gòu)體變量的定義 引用與初始化 2020 1 27 18 main inti n printf Entervote n scanf d 輸入所投候選人編號(hào) 7 2 2結(jié)構(gòu)體變量的定義 引用與初始化 2020 1 27 19 for i 1 i 5 i printf s d n list i name list i count printf s d n list 0 name list 0 count 7 2 2結(jié)構(gòu)體變量的定義 引用與初始化 2020 1 27 20 7 2結(jié)構(gòu)體類型 1 結(jié)構(gòu)體指針變量的定義 結(jié)構(gòu)體指針變量定義的一般形式 struct結(jié)構(gòu)體名 指針變量名 structdate intyear month day q 例如 structstudent p p是指向structstudent結(jié)構(gòu)體變量的指針變量 7 2 3結(jié)構(gòu)體的指針 2020 1 27 21 7 2 3結(jié)構(gòu)體的指針 2 結(jié)構(gòu)體成員的三種引用形式 用結(jié)構(gòu)體變量名的引用形式 d yeard monthd day structdate intyear month day d p 用結(jié)構(gòu)體指針變量的引用形式 p year p month p dayp yearp monthp day 是指向結(jié)構(gòu)體成員運(yùn)算符 優(yōu)先級(jí)為一級(jí) p d year 2020 1 27 22 例 輸入今天的日期 然后輸出該日期 main structdate 在函數(shù)中定義結(jié)構(gòu)體類型 intyear month day today p 7 2 3結(jié)構(gòu)體的指針 Entertodaydate YYYY MM DD 2006 06 23Today 2006 6 23 2020 1 27 23 3 指向結(jié)構(gòu)體數(shù)組的指針 例7 7 利用結(jié)構(gòu)體指針輸出一組化學(xué)元素名稱及其原子量 structlist inti charname 4 floatw tab 4 1 H 1 008 2 He 4 0026 3 Li 6 941 4 Be 9 01218 7 2 3結(jié)構(gòu)體的指針 2020 1 27 24 3 指向結(jié)構(gòu)體數(shù)組的指針 main structlist p printf No tName tAtomicWeight n for p tab pi p name p w NoNameAtomicWeight 1H1 008 2He4 0026 3Li6 941 4Be9 01218 7 2 3結(jié)構(gòu)體的指針 2020 1 27 25 例7 8 分析自增自減運(yùn)算對(duì)程序結(jié)果的影響 structcode inti charch a 1000 E 2000 F 3000 G 4000 H 接后面 7 2 3結(jié)構(gòu)體的指針 2020 1 27 26 main structcode p a printf d t p i printf c t p ch printf d t p i printf c t p ch printf d t p i printf d n p i p 1001 H 3001 1001 F 2000 H 3000 3001 7 2 3結(jié)構(gòu)體的指針 2020 1 27 27 7 2結(jié)構(gòu)體類型 7 2 4鏈表 結(jié)構(gòu)體的應(yīng)用 鏈表中每個(gè)元素稱為一個(gè)結(jié)點(diǎn) 構(gòu)成鏈表的結(jié)點(diǎn)必須是結(jié)構(gòu)體類型數(shù)據(jù) 1 鏈表的基本結(jié)構(gòu) head17822008324610855736圖7 2動(dòng)態(tài)單向鏈表示意圖 相鄰結(jié)點(diǎn)的地址不一定是連續(xù)的 依靠指針將它們連接起來 structnode charc structnode next 2020 1 27 28 C語(yǔ)言提供了相關(guān)的存儲(chǔ)管理庫(kù)函數(shù) 這里僅介紹其中三個(gè) 它們的原型說明在 stdlib h 頭文件和 alloc h 頭文件中 使用這三個(gè)函數(shù)時(shí) 應(yīng)選擇其中一個(gè)頭文件包含到源程序中 動(dòng)態(tài)分配存儲(chǔ)區(qū)函數(shù)malloc 函數(shù)原型 void malloc unsignedsize 調(diào)用格式 malloc size 功能 在內(nèi)存分配一個(gè)size字節(jié)的存儲(chǔ)區(qū) 調(diào)用結(jié)果為新分配的存儲(chǔ)區(qū)的首地址 是一個(gè)void類型指針 若分配失敗 則返回NULL 即0 7 2 4鏈表 2 動(dòng)態(tài)分配和釋放存儲(chǔ)單元 在ANSIC標(biāo)準(zhǔn)中 關(guān)鍵字void有兩種用法 第一種用法 可將無返回值的函數(shù)定義為void類型第二種用法 用void 定義指針 這是一個(gè)指向非具體數(shù)據(jù)類型的指針 稱為無類型指針 2020 1 27 29 例7 9 調(diào)用malloc函數(shù)分配所需存儲(chǔ)單元 include includemain structst intn structst next p p structst malloc sizeof structst p n 5 p next NULL printf p n d tp next x n p n p next 將函數(shù)返回值轉(zhuǎn)換成結(jié)構(gòu)體指針 7 2 4鏈表 p n 5p next 0 2020 1 27 30 動(dòng)態(tài)分配存儲(chǔ)區(qū)函數(shù)calloc 函數(shù)原型 void calloc unsignedintn unsignedintsize 調(diào)用格式 calloc n size 功能 在內(nèi)存分配一個(gè)n倍size字節(jié)的存儲(chǔ)區(qū) 調(diào)用結(jié)果為新分配的存儲(chǔ)區(qū)的首地址 是一個(gè)void類型指針 若分配失敗 則返回NULL 即0 2 動(dòng)態(tài)分配和釋放存儲(chǔ)單元 7 2 4鏈表 2020 1 27 31 例7 10 調(diào)用calloc函數(shù)分配所需存儲(chǔ)單元 includemain inti ip ip int calloc 10 4 for i 0 i 10 i scanf d ip i for i 0 i 10 i printf d ip i printf n 動(dòng)態(tài)分配了10個(gè)存放整型數(shù)據(jù)的存儲(chǔ)單元 7 2 4鏈表 2020 1 27 32 釋放動(dòng)態(tài)分配存儲(chǔ)區(qū)函數(shù)free 函數(shù)原型 voidfree void p 2 動(dòng)態(tài)分配和釋放存儲(chǔ)單元 此函數(shù)無返回值 實(shí)參必須是一個(gè)指向動(dòng)態(tài)分配存儲(chǔ)區(qū)的指針 它可以是任何類型的指針變量 調(diào)用格式 free p 功能 釋放p所指向的動(dòng)態(tài)分配的存儲(chǔ)區(qū) 7 2 4鏈表 2020 1 27 33 建立鏈表就是根據(jù)需要一個(gè)一個(gè)地開辟新結(jié)點(diǎn) 在結(jié)點(diǎn)中存放數(shù)據(jù)并建立結(jié)點(diǎn)之間的鏈接關(guān)系 例7 11 建立一個(gè)學(xué)生電話簿的單向鏈表函數(shù) 3 建立單向鏈表 7 2 4鏈表 2020 1 27 34 include include include defineNEW structnode malloc sizeof structnode structnode charname 20 tel 9 structnode next 7 2 4鏈表 2020 1 27 35 structnode create staticstructnode h structnode p q charname 20 h NULL printf name gets name while strlen name 0 當(dāng)輸入的姓名不是空串循環(huán) p NEW 開辟新結(jié)點(diǎn) if p NULL p為NULL 新結(jié)點(diǎn)分配失敗 printf Allocationfailure n exit 0 結(jié)束程序運(yùn)行 7 2 4鏈表 2020 1 27 36 strcpy p name name 為新結(jié)點(diǎn)中的成員賦值 printf tel gets p tel p next NULL if h NULL h為空 表示新結(jié)點(diǎn)為第一個(gè)結(jié)點(diǎn) h p 頭指針指向第一個(gè)結(jié)點(diǎn) else h不為空 q next p 新結(jié)點(diǎn)與尾結(jié)點(diǎn)相連接 q p 使q指向新的尾結(jié)點(diǎn) printf name gets name returnh 7 2 4鏈表 main structnode head head create 2020 1 27 37 例7 12 輸出學(xué)生電話簿鏈表函數(shù) 4 輸出單向鏈表中各結(jié)點(diǎn)信息 7 2 4鏈表 2020 1 27 38 include include include defineNEW structnode malloc sizeof structnode structnode charname 20 tel 9 structnode next voidprlist structnode head structnode p p head while p NULL printf s t s n p name p tel p p next main structnode head head create prlist head 2020 1 27 39 在鏈表中 如果要?jiǎng)h除第i個(gè)結(jié)點(diǎn) 一般是將第 i 1 個(gè)結(jié)點(diǎn)直接與第 i 1 個(gè)結(jié)點(diǎn)相連接 然后再釋放第i個(gè)結(jié)點(diǎn)的存儲(chǔ)單元 5 刪除單向鏈表中指定的結(jié)點(diǎn) 7 2 4鏈表 2020 1 27 40 例7 13 刪除學(xué)生電話簿鏈表中指定學(xué)生的信息 a 刪除第一個(gè)結(jié)點(diǎn) head p next 7 2 4鏈表 2020 1 27 41 b 刪除中間結(jié)點(diǎn)或尾結(jié)點(diǎn) q next p next 7 2 4鏈表 2020 1 27 42 c 未找到指定的結(jié)點(diǎn) strcmp x p name 0 7 2 4鏈表 2020 1 27 43 刪除第一個(gè)結(jié)點(diǎn) 刪除中間結(jié)點(diǎn)或尾結(jié)點(diǎn) 學(xué)生姓名 當(dāng)姓名不同并且不是尾結(jié)點(diǎn)循環(huán) 7 2 4鏈表 2020 1 27 44 include include include defineNEW structnode malloc sizeof structnode structnode charname 20 tel 9 structnode next structnode delnode structnode head char x structnode p q staticstructnode h if head NULL printf Thisisaemptylist 空鏈表情況 returnhead p head while strcmp x p name 0 q指針尾隨p指針向表尾移動(dòng) 查找結(jié)點(diǎn) 2020 1 27 45 if strcmp x p name 0 if p head head p next 刪除頭結(jié)點(diǎn) elseq next p next 刪除中間或尾結(jié)點(diǎn) free p 釋放被刪除的結(jié)點(diǎn) elseprintf Notfound 未找到指定的結(jié)點(diǎn) h head returnh 7 2 4鏈表 2020 1 27 46 將一個(gè)新結(jié)點(diǎn)插入到鏈表中 首先要尋找插入的位置 如果要求在第i個(gè)結(jié)點(diǎn)前插入 可設(shè)置三個(gè)工作指針p0 p和q p0是指向待插入結(jié)點(diǎn)的指針 利用p和q指針查找第i個(gè)結(jié)點(diǎn) 找到后再將新結(jié)點(diǎn)鏈接到鏈表上 6 在單向鏈表中插入結(jié)點(diǎn) q q 新的第i個(gè)結(jié)點(diǎn) 7 2 4鏈表 2020 1 27 47 a 在表頭插入結(jié)點(diǎn) head p0 p0 next p 7 2 4鏈表 2020 1 27 48 b 在表中間插入結(jié)點(diǎn) q next p0 p0 next p 7 2 4鏈表 2020 1 27 49 c 在表尾追加結(jié)點(diǎn) p next p0 p0 next NULL 7 2 4鏈表 2020 1 27 50 例7 14 在學(xué)生電話簿鏈表中插入一個(gè)學(xué)生的信息 要求將新的信息插入在指定學(xué)生信息之前 如果未找到指定學(xué)生 則追加在鏈表尾部 當(dāng)姓名不同并且不是尾結(jié)點(diǎn)循環(huán) 空表時(shí)插入結(jié)點(diǎn) 在表尾追加結(jié)點(diǎn) 在表頭插入結(jié)點(diǎn) 在表中間插入結(jié)點(diǎn) 7 2 4鏈表 2020 1 27 51 include include include defineNEW structnode malloc sizeof structnode structnode charname 20 tel 9 structnode next 7 2 4鏈表 2020 1 27 52 7 2 4鏈表 2020 1 27 53 if strcmp x p name 0 if p head head p0 在表頭插入結(jié)點(diǎn) elseq next p0 在表中間插入結(jié)點(diǎn) p0 next p else p next p0 在表尾插入結(jié)點(diǎn) p0 next NULL h head returnh 7 2 4鏈表 2020 1 27 54 例7 15 學(xué)生電話簿鏈表管理程序 編制此程序可利用例7 11至例7 14的4個(gè)函數(shù)完成鏈表的建立 輸出 刪除和插入等功能 這里只需編制一個(gè)main函數(shù)完成對(duì)這4個(gè)函數(shù)的調(diào)用 include include defineNEW structnode malloc sizeof structnode structnode charname 20 tel 9 structnode next 7 2 4鏈表 2020 1 27 55 main structnode create delnode structnode char structnode insert structnode structnode char voidprlist structnode structnode head NULL stu chars 80 name 20 intc 7 2 4鏈表 2020 1 27 56 do do printf n MENU n printf 1 Createalist n printf 2 Printalist n printf 3 Deleteanode n printf 4 Insertanode n printf 0 Quit n printf Enteryourchoice 0 4 gets s c atoi s while c4 可以先選擇1建立一個(gè)鏈表 然后根據(jù)需要選擇功能2 功能3 功能4 直到選擇0退出程序的運(yùn)行 7 2 4鏈表 2020 1 27 57 switch c case1 head create break case2 prlist head break case3 printf nInputanamedeleted n gets name head delnode head name break case4 stu NEW printf nInputanewnode n printf name gets stu name printf tel gets stu tel stu next NULL printf nInsertposition n printf name gets name head insert head stu name while c 7 2 4鏈表 2020 1 27 58 結(jié)構(gòu)體類型解決了如何描述一個(gè)邏輯上相關(guān) 但數(shù)據(jù)類型不同的一組分量的集合 在需要節(jié)省內(nèi)存儲(chǔ)空間時(shí) c語(yǔ)言還提供了一種由若干個(gè)不同類型的數(shù)據(jù)項(xiàng)組成 但共享同一存儲(chǔ)空間的構(gòu)造類型 7 3共用體類型 7 3 1共用體與共用體類型的定義 共用體 一種構(gòu)造類型數(shù)據(jù)共用體由若干不同類型的數(shù)據(jù)項(xiàng)組成 構(gòu)成共用體的各個(gè)數(shù)據(jù)項(xiàng)稱為共用體成員 由于共享的特性 只有最新存儲(chǔ)的數(shù)據(jù)是有效的 2020 1 27 59 union共用體名 數(shù)據(jù)類型1成員名1 數(shù)據(jù)類型2成員名2 數(shù)據(jù)類型n成員名n 7 3共用體類型 7 3 1共用體與共用體類型的定義 共用體類型定義的一般形式 union為關(guān)鍵字 共用體名是用戶定義的類型標(biāo)識(shí) 中是組成該共用體的成員 成員的數(shù)據(jù)類型可以是C語(yǔ)言所允許的任何數(shù)據(jù)類型 2020 1 27 60 例如 unionutype inti charch longl charc 4 7 3共用體類型 7 3 1共用體與共用體類型的定義 定義了一個(gè)unionutype共用體類型 共用體類型定義不分配內(nèi)存空間 只是說明此類型數(shù)據(jù)的組成情況 2020 1 27 61 7 3共用體類型 7 3 2共用體變量的定義與初始化 1 共用體變量的定義 利用已定義的共用體類型名定義變量union共用體名變量名表 例如 unionutypeu1 u2 按照共用體類型的組成 系統(tǒng)為定義的共用體變量分配內(nèi)存單元 共用體變量所占內(nèi)存大小等于共用體中占用內(nèi)存的長(zhǎng)度最長(zhǎng)的成員 2020 1 27 62 7 3 2共用體變量的定義與初始化 1 共用體變量的定義 在定義共用體類型的同時(shí)定義變量 例如 unionutype inti charch longl charc 4 a b c union共用體名 成員定義表 變量名表 2020 1 27 63 1 共用體變量的定義 直接定義共用體類型變量 例如 union inti charch longl charc 4 a b c union 成員定義表 變量名表 7 3 2共用體變量的定義與初始化 2020 1 27 64 2 共用體變量的運(yùn)算 用sizeof運(yùn)算符計(jì)算共用體變量所占內(nèi)存空間 unionutype inti charch longl charc 4 a b c sizeof a 的結(jié)果為4sizeof unionutype 的結(jié)果為4 7 3 2共用體變量的定義與初始化 2020 1 27 65 2 共用體變量的運(yùn)算 同類型共用體變量之間的賦值運(yùn)算 共用體變量之間進(jìn)行賦值時(shí) 系統(tǒng)僅賦當(dāng)前有效成員的值 即最新存儲(chǔ)的數(shù)據(jù) unionutype inti charch longl charc 4 a p 對(duì)共用體變量進(jìn)行取址運(yùn)算 7 3 2共用體變量的定義與初始化 2020 1 27 66 3 共用體變量成員的引用 共用體變量成員的引用有三種形式 例如 unionu charu1 intu2 x p 用共用體變量名的引用形式 x u1x u2 用共用體指針變量的引用形式 p u1 p u2p u1p u2 7 3 2共用體變量的定義與初始化 2020 1 27 67 4 共用體變量賦初值 例7 16 共用體變量賦初值 unionu charu1 intu2 main unionua 0 x9745 printf 1 c x n a u1 a u2 a u1 e printf 2 c x n a u1 a u2 共用體類型變量在定義時(shí)只能對(duì)第一個(gè)成員進(jìn)行賦初值 由于第一個(gè)成員是字符型 用一個(gè)字節(jié) 所以對(duì)于初值0 x9745僅能接受0 x45 初值的高字節(jié)被截去 1 E45 2 e65 7 3 2共用體變量的定義與初始化 2020 1 27 68 main union longn intk charc un un n 0 x12345678 printf lx n un n printf x n un k printf x n un c un c A printf ld n un n printf d n un k printf c n un c 7 3 2共用體變量的定義與初始化 12345678 12345678 78 305419841 305419841 A 2020 1 27 69 enum是關(guān)鍵字 枚舉名和枚舉常量是標(biāo)識(shí)符 枚舉常量之間用逗號(hào)分隔 例如 enumweekday Sun Mon Tue Wed Thu Fri Sat enumcolor1 blue green red enumflag false true 7 4枚舉類型 1 枚舉類型的定義 枚舉類型定義的一般形式 enum枚舉名 枚舉常量取值表 枚舉是一個(gè)具有有限個(gè)整型符號(hào)常量的集合 這些整型符號(hào)常量稱為枚舉常量 每個(gè)枚舉類型都必須進(jìn)行類型的定義 定義時(shí)必須將其所有的枚舉常量一一列舉 以便限定此枚舉類型變量的取值范圍 2020 1 27 70 7 4枚舉類型 2 枚舉常量的整型值 隱式定義 按照類型定義時(shí)枚舉常量列舉的順序分別代表0 1 2 等整型值 例如 enumweekday Sun Mon Tue Wed Thu Fri Sat 0 1 2 3 4 5 6 在枚舉類型中 每個(gè)枚舉常量都代表一個(gè)整型值 在定義枚舉類型的同時(shí)可隱式或顯式地定義枚舉常量所代表的值 2020 1 27 71 2 枚舉常量的整型值 顯式定義 在定義類型的同時(shí)指定枚舉常量的值 其中如有未指定值的枚舉常量 則根據(jù)前面的枚舉常量的值依次遞增1 例如 enumop plus 43 minus 45 multiply 42 divide 47 enumworkday Mon 1 Tue Wed Thu Fri 2 3 4 5 7 4枚舉類型 2020 1 27 72 例如 enumflagfg enumcolor1c1 enumcolor2 blank brown yellow white c2 enum lightblue lightgreen lightred c3 3 枚舉變量的定義 枚舉類型變量定義的三種形式 enum枚舉名枚舉變量名表 enum枚舉名 枚舉常量取值表 枚舉變量表 enum 枚舉常量取值表 枚舉變量表 7 4枚舉類型 2020 1 27 73 4 枚舉數(shù)據(jù)的運(yùn)算 用sizeof運(yùn)算符計(jì)算枚舉變量所占內(nèi)存空間 賦值運(yùn)算fg true c1 red c2 yellow c3 lightgreen c3 white 枚舉變量中存放的是整型值 每個(gè)枚舉變量占用4個(gè)字節(jié) 是enumcolor2類型的枚舉值 7 4枚舉類型 2020 1 27 74 4 枚舉數(shù)據(jù)的運(yùn)算 關(guān)系運(yùn)算 取址運(yùn)算enumcolor2 blank brown yellow white c2 enumflagfg c2 fg true falseSun Sat 真 1 假 0 按枚舉類型數(shù)據(jù)所代表的整型值進(jìn)行比較 7 4枚舉類型 2020 1 27 75 5 枚舉數(shù)據(jù)的輸入輸出 枚舉變量的輸入 枚舉變量的輸出方法一 直接輸出枚舉變量中存放的整型值 枚舉變量作為整型變量進(jìn)行輸入 例如 scanf d 1 含義不直觀 fg true printf d fg 7 4枚舉類型 在C系統(tǒng)中 不能直接對(duì)枚舉數(shù)據(jù)進(jìn)行輸入和輸出 由于枚舉變量可以作為整型變量處理 所以可以通過間接方法輸入輸出枚舉變量的值 2020 1 27 76 switch fg casefalse printf false break casetrue printf true 5 枚舉數(shù)據(jù)的輸入輸出 枚舉變量的輸出 方法二 利用多分支選擇語(yǔ)句輸出枚舉常量對(duì)應(yīng)的字符串 7 4枚舉類型 2020 1 27 77 enumflag false true fg char name false true fg true printf s name fg 5 枚舉數(shù)據(jù)的輸入輸出 枚舉變量的輸出 方法三 依據(jù)枚舉值 運(yùn)用指針方法輸出對(duì)應(yīng)的字符串 7 4枚舉類型 2020 1 27 78 fg true printf s fg 5 枚舉數(shù)據(jù)的輸入輸出 枚舉變量的輸出 枚舉常量是標(biāo)識(shí)符 不是字符串 以輸出字符串方式輸出枚舉常量是錯(cuò)誤的 7 4枚舉類型 2020 1 27 79 例7 18 編制一個(gè)程序 當(dāng)輸入今天的星期序號(hào)后 輸出明天是星期幾 enumweekday Mon 1 Tue Wed Thu Fri Sat Sun char name 8 error Mon Tue Wed Thu Fri Sat Sun 7 4枚舉類型 2020 1 27 80 main enumweekdayd printf Inputtoday snumeral 1 7 scanf d 7 4枚舉類型 2020 1 27 81 7 5類型重命名 1 為類型名定義別名 為類型名定義別名的一般形式 typedef類型名新類型名或typedef類型定義新類型名 用typedef為已存在的類型名再命名一個(gè)新的類型名 即別名 typedef是關(guān)鍵字 類型名可以是基本類型 構(gòu)造類型 指針類型或自定義類型名 新類型名是自定義的類型名 2020 1 27 82 7 5類型重命名 typedefintCOUNTER 定義COUNTER為整型類型名 typedefstructdate intyear intmonth intday DATE 定義DATE為structdate結(jié)構(gòu)體類型名 新類型名與舊類型名作用相同 并且可同時(shí)使用 inti 與COUNTERi 等價(jià) structdatebirthday 與DATEbirthday 等價(jià) 2020 1 27 83 2 為類型命名的方法 為基本類型命名例如 typedeffloatREAL REALx y 相當(dāng)于floatx y 以typedef開頭 加上變量定義的形式 并用新類型名替代變量名 為數(shù)組類型命名例如 typedefcharCHARR 80 CHARRc d 4 相當(dāng)于charc 80 d 4 80 7 5類型重命名 2020 1 27 84 2 為類型命名的方法 為指針類型命名例如 typedefint IPOINT IPOINTip 相當(dāng)于int ip IPOINT pp 相當(dāng)于int pp typedefint FUNpoint FUNpointfunp 相當(dāng)于int funp 7 5類型重命名 2020 1 27 85 2 為類型命名的方法 為結(jié)構(gòu)體 共用體類型命名例如 structnode charc structnode next typedefstructnodeCHNODE CHNODE p 相當(dāng)于structnode p structCHNODE p 7 5類型重命名 2020 1 27 86 本章小結(jié) 結(jié)構(gòu)體 結(jié)構(gòu)體數(shù)據(jù)類型的概念和存儲(chǔ)結(jié)構(gòu) 用結(jié)構(gòu)體類型定義結(jié)構(gòu)體變量 數(shù)組和指針的方法 并能正確引用結(jié)構(gòu)體成員 動(dòng)態(tài)分配存儲(chǔ)單元的概念和malloc calloc等庫(kù)函數(shù)的使用方法共用體 共用體類型的概念和存儲(chǔ)結(jié)構(gòu) 用共用體類型定義共用體變量的方法 并能正確地引用共用體成員枚舉類型類型重命名- 1.請(qǐng)仔細(xì)閱讀文檔,確保文檔完整性,對(duì)于不預(yù)覽、不比對(duì)內(nèi)容而直接下載帶來的問題本站不予受理。
- 2.下載的文檔,不會(huì)出現(xiàn)我們的網(wǎng)址水印。
- 3、該文檔所得收入(下載+內(nèi)容+預(yù)覽)歸上傳者、原創(chuàng)作者;如果您是本文檔原作者,請(qǐng)點(diǎn)此認(rèn)領(lǐng)!既往收益都?xì)w您。
下載文檔到電腦,查找使用更方便
14.9 積分
下載 |
- 配套講稿:
如PPT文件的首頁(yè)顯示word圖標(biāo),表示該P(yáng)PT已包含配套word講稿。雙擊word圖標(biāo)可打開word文檔。
- 特殊限制:
部分文檔作品中含有的國(guó)旗、國(guó)徽等圖片,僅作為作品整體效果示例展示,禁止商用。設(shè)計(jì)者僅對(duì)作品中獨(dú)創(chuàng)性部分享有著作權(quán)。
- 關(guān) 鍵 詞:
- 北京科技大學(xué) 語(yǔ)言
鏈接地址:http://www.hcyjhs8.com/p-5367245.html