版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、第8章 結(jié)構(gòu)和聯(lián)合,本章要點(diǎn) C語(yǔ)言的結(jié)構(gòu)類型。 結(jié)構(gòu)數(shù)組。 指向結(jié)構(gòu)的指針。 C語(yǔ)言的動(dòng)態(tài)數(shù)據(jù)結(jié)構(gòu)。 聯(lián)合類型。 本章難點(diǎn) 結(jié)構(gòu)指針和C語(yǔ)言的動(dòng)態(tài)數(shù)據(jù)結(jié)構(gòu)。,8.1 結(jié)構(gòu)的說(shuō)明和引用 8.2 結(jié)構(gòu)的指針 8.3 結(jié)構(gòu)和函數(shù) 8.4 結(jié)構(gòu)數(shù)組 8.5 結(jié)構(gòu)和指針的應(yīng)用 8.6 聯(lián)合(共用體) 8.7 用typedef定義類型名,8.1 結(jié)構(gòu)的說(shuō)明和引用,在實(shí)際中常常描述同一對(duì)象的不同屬性,如一個(gè)學(xué)生有學(xué)號(hào)、姓名、性別、年齡、各科分?jǐn)?shù),表示這些屬性的數(shù)據(jù)具有不同的類型,因而不能用數(shù)組表示。C語(yǔ)言提供了一種數(shù)據(jù)結(jié)構(gòu),可以把這些不同類型的數(shù)據(jù)組成一個(gè)整體,這就是結(jié)構(gòu)類型。 結(jié)構(gòu)類型是各種結(jié)構(gòu)的總稱,
2、是一種構(gòu)造類型。一個(gè)結(jié)構(gòu)變量可以由不同類型的成員變量組成,這些成員變量又稱為結(jié)構(gòu)的域、分量。結(jié)構(gòu)的所有成員除自身的名字外,還擁有共同的名字,即結(jié)構(gòu)變量名。,8.1.1 結(jié)構(gòu)說(shuō)明 8.1.2 結(jié)構(gòu)的引用,8.1.1 結(jié)構(gòu)說(shuō)明,struct 結(jié)構(gòu)體名 數(shù)據(jù)類型1 成員名1; 數(shù)據(jù)類型2 成員名2; 數(shù)據(jù)類型n 成員名n; ;,結(jié)構(gòu)體類型定義的一般形式:,struct為關(guān)鍵字; 結(jié)構(gòu)體名是用戶定義的類型標(biāo)識(shí)。 中是組成該結(jié)構(gòu)體的成員。成員的數(shù)據(jù)類型可以是C語(yǔ)言所允許的任何數(shù)據(jù)類型。,在定義結(jié)構(gòu)體類型的同時(shí)定義變量,例如: struct student char num8,name20,sex; in
3、t age; float score; st30;,struct 結(jié)構(gòu)體名 成員定義表; 變量名表;,直接定義結(jié)構(gòu)體類型變量,例如: struct char num8,name20,sex; int age; float score; st30, a, b, c;,struct 成員定義表; 變量名表;,在結(jié)構(gòu)的說(shuō)明中,結(jié)構(gòu)成員可以為任何類型且結(jié)構(gòu)成員還可以和結(jié)構(gòu)外部的其它變量同名,不同結(jié)構(gòu)的成員也可以同名,但同一結(jié)構(gòu)的成員不能同名。,例如學(xué)生類型的定義: struct student char num8; /* 學(xué)號(hào)是字符數(shù)組類型 */ char name30; /* 姓名是字符數(shù)組類型 *
4、/ char sex; /* 性別是字符型 */ int age; /* 年齡是整型 */ char addr60; /* 住址是字符數(shù)組類型 */ int score6; /* 成績(jī)是整型數(shù)組類型 */ ;,利用已定義的結(jié)構(gòu)體類型名定義變量 struct 結(jié)構(gòu)體名 變量名表; 例如: struct student s30, t1, t2;,按照結(jié)構(gòu)體類型的組成,系統(tǒng)為定義的結(jié)構(gòu)體變量分配內(nèi)存單元。結(jié)構(gòu)體變量的各個(gè)成員在內(nèi)存中占用連續(xù)存儲(chǔ)區(qū)域,結(jié)構(gòu)體變量所占內(nèi)存大小為結(jié)構(gòu)體中每個(gè)成員所占用內(nèi)存的長(zhǎng)度之和。,8.1.2 結(jié)構(gòu)的引用,1結(jié)構(gòu)的初始化 結(jié)構(gòu)變量在說(shuō)明時(shí)可以初始化,初值是由常量表達(dá)式組
5、成的初值表。例如, struct student char name10; short sex; int age; float score; student1“zhangsan”,1,20,88.8;,2結(jié)構(gòu)變量的引用 對(duì)結(jié)構(gòu)變量的引用只允許下列5種情況: (1)同類型的結(jié)構(gòu)變量相互賦值。例如 student2=student1; (2)函數(shù)返回的結(jié)構(gòu)成員給同類型的結(jié)構(gòu)變量。 (3)對(duì)結(jié)構(gòu)變量取地址。例如 student.sex=0; scanf(“%s”,); 但=”zhang san”; 則為非法。,4嵌套的結(jié)構(gòu) 結(jié)構(gòu)的一個(gè)成員可以是一個(gè)
6、結(jié)構(gòu),含有結(jié)構(gòu)成員的結(jié)構(gòu)稱為嵌套的結(jié)構(gòu)。,struct date int year,month,day; struct student char num8; char name30; char sex; struct date birthday; /* 成員為結(jié)構(gòu)體類型 */ char addr60; int score6; ;,例:輸入三個(gè)人的信息,求其總成績(jī)。,#include void main() struct stud char name20; int age; char sfzh20; float zcj; a,b,c; float zcj; printf(請(qǐng)輸入第一個(gè)人的信息:n
7、ame,age,sfzh,zcj:n); scanf(%s %d %s %f,, ,8.2 結(jié)構(gòu)的指針,指向結(jié)構(gòu)的指針(或稱結(jié)構(gòu)指針)可以用來(lái)引用結(jié)構(gòu)的成員,可以作為參數(shù)傳給函數(shù),也可以作為函數(shù)的返回值。 1結(jié)構(gòu)指針的說(shuō)明 指向結(jié)構(gòu)的指針使用之前也要進(jìn)行說(shuō)明,例如 struct date int year, month, day;d, *p=,用結(jié)構(gòu)體變量名的引用形式: d.year d.month d.day,用結(jié)構(gòu)體指針變量的引用形式: (*p).year (*p).month (*p).day p-year p-month p-day 注意:成員引用表達(dá)式中的( )不能省,如
8、(*pd).day不能寫成*pd.day,因?yàn)椤?”運(yùn)算符的優(yōu)先級(jí)高于*,所以*pd.day等同于*(pd.day),在該例中為非法操作。 結(jié)構(gòu)成員運(yùn)算符“-”和“.”的優(yōu)先級(jí)相同,它們與()、 屬于同一優(yōu)先級(jí),按從左到右結(jié)合。,8.3 結(jié)構(gòu)和函數(shù),1結(jié)構(gòu)作函數(shù)的參數(shù) 結(jié)構(gòu)作函數(shù)的參數(shù)有三種可能的方法。 (1)傳一個(gè)結(jié)構(gòu)成員(用結(jié)構(gòu)成員作實(shí)參); (2)傳整個(gè)結(jié)構(gòu)(用結(jié)構(gòu)變量名作實(shí)參); (3)傳結(jié)構(gòu)的指針(用結(jié)構(gòu)的地址或指向結(jié)構(gòu)的指針作實(shí)參)。 我們推薦使用第三種方法。 函數(shù)的返回值為結(jié)構(gòu)變量或指向結(jié)構(gòu)變量的指針。,已定義在comp.h中。struct complex float re; /
9、*實(shí)部*/float im; /*虛部*/ ;,【例8.3】寫一個(gè)函數(shù)計(jì)算兩個(gè)復(fù)數(shù)的和。 #include comp.h struct complex *addcomp(struct complex c1, struct complex c2) static struct complex temp; temp.re=c1.re+c2.re; temp.im=c1.im+c2.im; return( ,8.4 結(jié)構(gòu)數(shù)組,8.4.1 結(jié)構(gòu)數(shù)組的說(shuō)明,引用和初始化 8.4.2 結(jié)構(gòu)數(shù)組作函數(shù)參數(shù) 8.4.3 sizeof運(yùn)算符 8.4.4 用結(jié)構(gòu)的指針引用結(jié)構(gòu)數(shù)組的成員,8.4.1 結(jié)構(gòu)數(shù)組的說(shuō)明、
10、引用和初始化,結(jié)構(gòu)數(shù)組是其元素都是具有相同結(jié)構(gòu)體類型的結(jié)構(gòu)體變量。定義的一般格式為: struct 結(jié)構(gòu)體名 結(jié)構(gòu)體數(shù)組名元素個(gè)數(shù),結(jié)構(gòu)體數(shù)組名元素個(gè)數(shù),; 其中,“struct 結(jié)構(gòu)體名”是已定義過(guò)的結(jié)構(gòu)體類型。因此定義結(jié)構(gòu)體數(shù)組和定義結(jié)構(gòu)體變量的方法相仿,只需說(shuō)明其為數(shù)組即可。,例如: struct student int num; char name10; char sex; int age; float score; char addr30; ; struct student stu3; 以上定義了一個(gè)數(shù)組stu,其元素為struct student類型數(shù)據(jù),數(shù)組有3個(gè)元素。,2、結(jié)構(gòu)
11、體數(shù)組的初始化 一個(gè)外部的或靜態(tài)的結(jié)構(gòu)體數(shù)組在定義的同時(shí)可以初始化。其一般格式是在定義之后緊跟一個(gè)用花括號(hào)括起來(lái)的一組初始化數(shù)據(jù): struct 結(jié)構(gòu)體名 結(jié)構(gòu)體數(shù)組名=初始數(shù)據(jù)表列; 其中,“struct 結(jié)構(gòu)體名”是已定義過(guò)的結(jié)構(gòu)體類型。,【例8.6】對(duì)候選人得票的統(tǒng)計(jì)程序。設(shè)有三個(gè)侯選人,每次輸入一個(gè)得票的候選人的名字,要求最后輸出各人得票結(jié)果。 #include #include “string.h” struct person char name18; int count; leader3=Li,0,Zhang,0,Wang,0;,void main () int i,j; char
12、 leader_name18; for(i=1;i=10;i+) scanf (%s,leader_name); for (j=0;j3;j+) if(strcmp(leader_name,)=0) leaderj.count+; printf (n); for (i=0;i3;i+) printf(%5s,%dn,,leaderi.count); ,8.4.2 結(jié)構(gòu)數(shù)組作函數(shù)參數(shù),類似于整型數(shù)組,8.4.3 sizeof運(yùn)算符,sizeof是一個(gè)單目運(yùn)算符,用于計(jì)算一個(gè)對(duì)象的大小,它是在編譯時(shí)執(zhí)行的運(yùn)算,所以sizeof表達(dá)式是一個(gè)常量表達(dá)式,
13、sizeof表達(dá)式有兩種形式: sizeof表達(dá)式或 sizeof(表達(dá)式) sizeof(類型名),【例】利用結(jié)構(gòu)體指針輸出一組化學(xué)元素名稱及其原子量。 struct list int i; char name4; float w; tab4=1,H,1.008,2,He,4.0026, 3,Li,6.941,4,Be,9.01218;,8.4.4 用結(jié)構(gòu)的指針引用結(jié)構(gòu)數(shù)組的成員,main( ) struct list *p; printf(NotNametAtomic Weightn); for (p=tab; pi, p-name, p-w); ,No Name Atomic Weigh
14、t,1 H 1.008,2 He 4.0026,3 Li 6.941,4 Be 9.01218,鏈表是一種動(dòng)態(tài)數(shù)據(jù)結(jié)構(gòu),可根據(jù)需要?jiǎng)討B(tài)地分配存儲(chǔ)單元。在數(shù)組中,插入或刪除一個(gè)元素都比較繁瑣,而用鏈表則相對(duì)容易。但是數(shù)組元素的引用比較簡(jiǎn)單,對(duì)于鏈表中結(jié)點(diǎn)數(shù)據(jù)的存取操作則相對(duì)復(fù)雜。, 鏈表中每個(gè)元素稱為一個(gè)結(jié)點(diǎn)。 構(gòu)成鏈表的結(jié)點(diǎn)必須是結(jié)構(gòu)體類型數(shù)據(jù)。, 相鄰結(jié)點(diǎn)的地址不一定是連續(xù)的,依靠指針將 它們連接起來(lái)。,struct node char c; struct node *next; ;,8.5 結(jié)構(gòu)指針的應(yīng)用,C語(yǔ)言提供了相關(guān)的存儲(chǔ)管理庫(kù)函數(shù)。這里僅介紹其中三個(gè),它們的原型說(shuō)明在“stdlib
15、.h”頭文件和“malloc.h”頭文件中,使用這三個(gè)函數(shù)時(shí),應(yīng)選擇其中一個(gè)頭文件包含到源程序中。, 動(dòng)態(tài)分配存儲(chǔ)區(qū)函數(shù)malloc( ) 函數(shù)原型:void *malloc(unsigned size); 調(diào)用格式:malloc(size) 功能:在內(nèi)存分配一個(gè)size字節(jié)的存儲(chǔ)區(qū)。調(diào)用 結(jié)果為新分配的存儲(chǔ)區(qū)的首地址,是一個(gè)void 類型指針。若分配失敗,則返回NULL(即0)。,在ANSI C標(biāo)準(zhǔn)中,關(guān)鍵字void有兩種用法。 第一種用法,可將無(wú)返回值的函數(shù)定義為void類型 第二種用法,用void * 定義指針,這是一個(gè)指向 非具體數(shù)據(jù)類型的指針,稱為無(wú)類型指針。,動(dòng)態(tài)分配和釋放存儲(chǔ)單元
16、,【例】調(diào)用malloc函數(shù)分配所需存儲(chǔ)單元。 #include main( ) struct st int n; struct st *next; *p; p=(struct st *)malloc(sizeof(struct st); p-n=5; p-next=NULL; printf(p-n=%dtp-next=%xn,p-n,p-next); ,將函數(shù)返回值轉(zhuǎn)換成結(jié)構(gòu)體指針, 動(dòng)態(tài)分配存儲(chǔ)區(qū)函數(shù)calloc( ) 函數(shù)原型: void *calloc(unsigned int n,unsigned int size); 調(diào)用格式:calloc(n,size) 功能:在內(nèi)存分配一個(gè)n倍
17、size字節(jié)的存儲(chǔ)區(qū)。調(diào)用結(jié)果為新分配的存儲(chǔ)區(qū)的首地址,是一個(gè)void類型指針。若分配失敗,則返回NULL(即0)。,【例】調(diào)用calloc函數(shù)分配所需存儲(chǔ)單元。 #include main( ) int i,*ip; ip=(int *)calloc(10,4); for (i=0; i10; i+) scanf(%d,ip+i); for (i=0; i10; i+) printf(%d ,*(ip+i); printf(n); ,動(dòng)態(tài)分配了10個(gè)存放整型數(shù)據(jù)的存儲(chǔ)單元, 釋放動(dòng)態(tài)分配存儲(chǔ)區(qū)函數(shù)free( ) 函數(shù)原型:void free(void *p);,此函數(shù)無(wú)返回值,實(shí)參必須是一個(gè)指向動(dòng)態(tài)分配存儲(chǔ)區(qū)的指針,它可以是任何類型的指針變量。,調(diào)用格式:free(p) 功能:釋放p所指向的動(dòng)態(tài)分配的存儲(chǔ)區(qū)。,8.6 聯(lián)合(共用體),在實(shí)際處理中為了方便處理,有時(shí)需要在不同的時(shí)刻將不同類型的值存放在同一變量中,而在任一時(shí)刻,該變量?jī)H含特定類型的值,這種變量就是聯(lián)合類型的變量(簡(jiǎn)稱聯(lián)合或聯(lián)合類型變量)。 聯(lián)合的定義方式就是將struct用union代替,其它形式同結(jié)構(gòu)相同。如:假定一個(gè)常量可能是int、doubl
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- (試題)糧油保管員考試試題及答案
- 電鈷安全培訓(xùn)考試試題及答案
- 綠色施工專項(xiàng)施工方案培訓(xùn)資料
- 譯林版小學(xué)英語(yǔ)六年級(jí)上冊(cè)Unit 4 Soundtime課時(shí)教學(xué)設(shè)計(jì)
- 大概念統(tǒng)攝·素養(yǎng)進(jìn)階:初中歷史“社會(huì)變遷的引擎”專題深度復(fù)習(xí)與關(guān)鍵能力突破方案
- 2026廣西北部灣大學(xué)招聘體育學(xué)院專任教師6人備考題庫(kù)及答案詳解參考
- (聯(lián)盟題庫(kù))中式面點(diǎn)師(中級(jí))理論知識(shí)模擬試卷附答案
- 汽修教師考試試題及答案
- 2026上半年貴州事業(yè)單位聯(lián)考銅仁市萬(wàn)山區(qū)招聘26人備考題庫(kù)及1套參考答案詳解
- 2026新疆第三師圖木舒克市招聘事業(yè)單位工作人員84人備考題庫(kù)及一套答案詳解
- 2026年各地高三語(yǔ)文1月聯(lián)考文言文匯編(文言詳解+挖空)
- 2026年春季統(tǒng)編版三年級(jí)下冊(cè)小學(xué)語(yǔ)文教學(xué)計(jì)劃(含進(jìn)度表)
- 家庭醫(yī)生簽約服務(wù)工作實(shí)施方案
- 冰箱安裝施工方案
- 村委安全生產(chǎn)責(zé)任制度
- 2025-2030中國(guó)碳酸氫鈉市場(chǎng)未來(lái)前瞻及投資戰(zhàn)略規(guī)劃策略建議研究報(bào)告
- 土石方開挖與回填施工方案
- 2025年12月廣西區(qū)一模語(yǔ)文2025-2026年度首屆廣西職教高考第一次模擬考試2026年廣西高等職業(yè)教育考試模擬測(cè)試語(yǔ)文含逐題答案解釋99
- 2026元旦主題班會(huì):馬年猜猜樂(lè)猜成語(yǔ) (共130題)【課件】
- 2026年盤錦職業(yè)技術(shù)學(xué)院?jiǎn)握新殬I(yè)技能測(cè)試題庫(kù)及參考答案詳解一套
- 湖北省2024-2025學(xué)年高二上學(xué)期期末考試英語(yǔ)含答案
評(píng)論
0/150
提交評(píng)論