版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、第第8 8章章 結(jié)構(gòu)體和共用體結(jié)構(gòu)體和共用體學(xué)習(xí)目標(biāo)1. 掌握結(jié)構(gòu)體類型、結(jié)構(gòu)體變量、結(jié)構(gòu)體數(shù)組的定義2. 掌握結(jié)構(gòu)體變量指針、結(jié)構(gòu)體數(shù)組元素指針等基本概念3. 掌握結(jié)構(gòu)體指針的聲明、初始化、賦值及引用4. 了解共用體類型的定義、共用體變量的聲明、賦值及使用5. 了解枚舉類型的定義、枚舉類型變量的聲明、賦值及使用6. 理解typedef的功能8.1 結(jié)構(gòu)體結(jié)構(gòu)體 數(shù)組中各元素是屬于同一個(gè)類型。若要將不同類型的數(shù)據(jù)組合成一個(gè)有機(jī)的整體,例如:姓名、年齡、性別、成績組合為一個(gè)組合項(xiàng),c用結(jié)構(gòu)體來建立這種數(shù)據(jù)結(jié)構(gòu)。 8.1.1 結(jié)構(gòu)體類型結(jié)構(gòu)體類型 一個(gè)結(jié)構(gòu)體類型可以由若干個(gè)被稱為成員(或域)的成分
2、組成。 每個(gè)成員具有自身的名字和數(shù)據(jù)類型,同一結(jié)構(gòu)中的成員名不能相同。例如一個(gè)學(xué)生的信息,它包括以下5項(xiàng): (1) 學(xué)號:用5位數(shù)字表示,長整型; (2) 姓名:用漢語拼音表示,最多20個(gè)字符; (3) 性別:用m或f表示,分別表示男或女; (4) 生日:如19881015,表示年月日; (5) 地址:用字符數(shù)組表示,最多30個(gè)字符。 8.1.2 結(jié)構(gòu)體類型的聲明結(jié)構(gòu)體類型的聲明 一個(gè)結(jié)構(gòu)體類型的一般形式為: struct 結(jié)構(gòu)體名 類型名1 成員名1; 類型名2 成員名2; 類型名n 成員名n; ; 例如: struct stu long int num; /* 學(xué)號 */ char nam
3、e20; /* 姓名 */ char sex; /* 性別 */ unsigned long birthday; /* 生日 */ char addr30; /* 地址 */ ;說明: (1) 結(jié)構(gòu)體聲明描述了結(jié)構(gòu)體的組織形式,但在編譯時(shí)并不為它分配存儲(chǔ)空間。 (2) 結(jié)構(gòu)體的成員可以是簡單變量、數(shù)組、指針、結(jié)構(gòu)體或共用體等。 (3) 結(jié)構(gòu)體不可嵌套定義,但可以嵌套使用,例如:struct date int day; char month4; int year; ;struct student long int num; char name20; char sex; struct date b
4、irthday; /* 結(jié)構(gòu)體成員是另一種結(jié)構(gòu)類型,結(jié)構(gòu)體在此嵌套 */ char *addr; ;numnamesexbirthdayaddrdaymonthyear嵌套結(jié)構(gòu)體嵌套結(jié)構(gòu)體studentstudent的邏輯結(jié)構(gòu)的邏輯結(jié)構(gòu) (4) 結(jié)構(gòu)體聲明可以在函數(shù)內(nèi)部,也可以在函數(shù)外部。 (5) 定義結(jié)構(gòu)體類型時(shí),注意不能遺漏最后的分號。8.1.3 結(jié)構(gòu)體變量結(jié)構(gòu)體變量 一、結(jié)構(gòu)體變量的定義一、結(jié)構(gòu)體變量的定義 可以采取以下三種方法定義結(jié)構(gòu)體類型變量。 1在聲明結(jié)構(gòu)體類型的同時(shí)定義變量。例如: struct student long int num; char name20; char se
5、x; int age; float score; s1,s2,s3; 聲明結(jié)構(gòu)體類型的同時(shí)定義結(jié)構(gòu)體變量的一般形式為: struct 結(jié)構(gòu)體名 類型名1 成員名1;類型名2 成員名2; 類型名n 成員名n; 變量名,變量名,變量名m; 特點(diǎn):定義一次結(jié)構(gòu)體變量之后,在該定義之后的任何位置仍可用該結(jié)構(gòu)體類型來定義其它結(jié)構(gòu)體變量。 2直接定義結(jié)構(gòu)類型變量 例如: struct long int num; char name20; char sex; int age; float score; stu1,stu2,stu3;直接定義結(jié)構(gòu)體變量的一般形式為:struct 類型名1 成員名1;類型名2
6、成員名2;類型名n 成員名n;變量名,變量名,變量名m;特點(diǎn):由于在struct后不出現(xiàn)結(jié)構(gòu)體名,故不便于在源程序的其他地方定義該類型的新變量。 3先聲明結(jié)構(gòu)體類型再定義變量名 例如: struct student long int num; char name20; char sex; int age; float score; ; struct student stu1,stu2,stu3; 一般形式為:struct 結(jié)構(gòu)體名 類型名1 成員名1;類型名2 成員名2;類型名n 成員名n;struct 結(jié)構(gòu)體名 變量名,變量名,變量名m;特點(diǎn):在該定義之后的任何位置,不僅可用該結(jié)構(gòu)體類型來定
7、義其他結(jié)構(gòu)體變量,而且可把其結(jié)構(gòu)體聲明部分作為文件存放起來,這樣就可借助于include命令把它復(fù)制到任何源文件中,用以定義同類型的其它結(jié)構(gòu)體變量。 注意: (1) 定義一定要在結(jié)構(gòu)體聲明之后或與結(jié)構(gòu)體聲明同時(shí)進(jìn)行,對尚未聲明的結(jié)構(gòu)體類型,不能用它來定義結(jié)構(gòu)體變量。 (2) 存儲(chǔ)空間分配是按照其對應(yīng)的各成員項(xiàng)的定義順序進(jìn)行的。 (3) 同一結(jié)構(gòu)類型的每個(gè)結(jié)構(gòu)體變量,存儲(chǔ)空間的大小都相同,是各成員項(xiàng)所占空間之和。例如: sizeof(stu1)的值為31; sizeof(struct student)的值為31; sizeof(float)的值為4。 (4) 結(jié)構(gòu)體變量中的成員可以單獨(dú)使用,地位
8、與一般變量相同。 (5) 結(jié)構(gòu)體變量一般不用register型。二、結(jié)構(gòu)體變量的初始化二、結(jié)構(gòu)體變量的初始化 struct student long int num; char name20; char sex; char addr20; stu1,stu2=89031,lilin,m,123 beijing road; /* 結(jié)構(gòu)體變量stu2初始化 */三、結(jié)構(gòu)體變量的引用三、結(jié)構(gòu)體變量的引用 形式:結(jié)構(gòu)體變量名成員名#includevoid main() struct student long int num; char name20; char sex; char addr20; st
9、u1,stu2=89031,lilin,m,123 beijing road; /* 結(jié)構(gòu)體變量stu2初始化 */ printf(no.:%ldnname:%snsex:%cnaddress:%sn,stu2.num,,stu2.sex, stu2.addr); stu1=stu2; /* 兩個(gè)相同類型的結(jié)構(gòu)體變量之間可以進(jìn)行賦值操作 */ printf(no.:%ldnname:%snsex:%cnaddress:%sn,stu1.num,,stu1.sex, stu1.addr); 注意: (1) 不能將一個(gè)結(jié)構(gòu)體變量作為一個(gè)整體進(jìn)行輸入和輸出。例:s
10、canf(%ld%s%c%s,&stu1); printf(no.:%ldnname:%snsex:%cnaddress:%sn,stu2); 只能對結(jié)構(gòu)體變量中的各個(gè)成員分別進(jìn)行輸入和輸出,如: stu1.num=89031; strcpy(,liling); scanf(%c%s,&stu1.sex,stu1.addr); (2) 對結(jié)構(gòu)體中的成員,可以單獨(dú)使用,它的作用與地位相當(dāng)于普通變量。 stu1.num =stu2.num; (3) 結(jié)構(gòu)體變量可以進(jìn)行整體賦值,但不能整體進(jìn)行比較。下列語句是錯(cuò)誤的: if(stu1stu2) printf(name:%sn,stu
11、1.name); (4) 如果成員本身又屬一個(gè)結(jié)構(gòu)體類型,則要逐級地找到最低的一級成員。只能對最低級的成員進(jìn)行存取。 8.2 結(jié)構(gòu)體數(shù)組結(jié)構(gòu)體數(shù)組 8.2.1 結(jié)構(gòu)體數(shù)組的定義結(jié)構(gòu)體數(shù)組的定義1定義結(jié)構(gòu)體類型后定義結(jié)構(gòu)數(shù)組。例如:struct student long int num; char name20; char sex; int age; float score;struct student stu5; 2直接定義一個(gè)結(jié)構(gòu)數(shù)組。 例如: struct student long int num; char name20; char sex; int age; float score;
12、stu5;或 struct long int num; char name20; char sex; int age; float score; stu5;numnamesexagescorestu0stu1stu2stu3stu4結(jié)構(gòu)體數(shù)組的邏輯結(jié)構(gòu)結(jié)構(gòu)體數(shù)組的邏輯結(jié)構(gòu) 8.2.2 結(jié)構(gòu)數(shù)組的初始化結(jié)構(gòu)數(shù)組的初始化 格式: struct 結(jié)構(gòu)體名 結(jié)構(gòu)數(shù)組名元素個(gè)數(shù)=初始數(shù)據(jù); struct student stu3=80101,lilin,m,18, 80102,wanglan,f,19,80103,zhangjun,f,20; struct student stu =80101,lili
13、n,m,18, 80102,wanglan,f,19,80103,zhangjun,f,20; struct student long int num; char name20; char sex; int age; stu = 80101, lilin,m,18, 80102, wanglan,f,19, 80103, zhangjun,f, 20;2052203120512027結(jié)構(gòu)數(shù)組結(jié)構(gòu)數(shù)組stu在內(nèi)存中的分配情況在內(nèi)存中的分配情況stu0stu1stu2200020272054 num name sexage8.2.3 結(jié)構(gòu)數(shù)組元素的引用結(jié)構(gòu)數(shù)組元素的引用 形式:結(jié)構(gòu)體數(shù)組名下標(biāo)成員
14、名 例如 stu0.num=80101; strcpy(,lilin); 例:統(tǒng)計(jì)全班男女生人數(shù)及1990年以后(含1990年)出生的人數(shù)。#include string.h#include stdio.hvoid main() struct stud /* 定義一個(gè)結(jié)構(gòu)stud ,包含3個(gè)成員 */ char name20;/* 姓名 */ char sex;/* 性別 */ int year; /* 出身年份 */ ; struct stud class100; /* 定義一個(gè)結(jié)構(gòu)數(shù)組class */ int m_num=0,f_num=0,total90=0,class
15、_num,i ; printf(please enter class_num: ); scanf(%d,&class_num); /* 輸入班級人數(shù) */ for(i=0;iclass_num;i+) /* 輸入同學(xué)信息 */ printf(nplease enter name/sex/year: ); scanf(%s %c %d,,&classi.sex,&classi.year); for(i=0;iclass_num;i+) /* 輸出班級同學(xué)信息 */ printf(n%-10s%c%6d,,classi.sex,classi.year);
16、 for(i=0;i=1990) total90+; /* 統(tǒng)計(jì)90以后出生的人數(shù) */ printf(n number of boy: %d,m_num); printf(n number of girl: %d,f_num); printf(n number after of 1990: %d,total90); 測試數(shù)據(jù)與運(yùn)行結(jié)果:輸入:please enter class_num: 3please enter name/sex/year:zhanglin m 1988please enter name/sex/year:wangpin f 1990please enter name/s
17、ex/year:liutao m 1989輸出:zhanglin m 1988wangpin f 1990liutao m 1989number of boy: 2number of girl: 1number after of 1990: 18.3 結(jié)構(gòu)指針結(jié)構(gòu)指針 8.3.1指向結(jié)構(gòu)體變量的指針指向結(jié)構(gòu)體變量的指針 形式: struct 結(jié)構(gòu)體名 *結(jié)構(gòu)指針名; 例: static struct student *p; 結(jié)構(gòu)指針在定義時(shí)也可以初始化。 例: struct student long int num; char name20; char sex; int age; float
18、score; stu1,*p=&stu1; 用指針引用結(jié)構(gòu)體成員的一般形式:(*結(jié)構(gòu)指針名).成員名 或結(jié)構(gòu)指針名-成員名 設(shè)有類型、變量聲明及初始化如下: struct date int day; char month4; int year; birthday,*sp=&birthday; 則 (*sp).day、(*sp).month、sp-day、sp-month均是合法。其中 (*sp).day和sp-day等效 (*sp).month和sp-month等效。例:#includestdio.h#includestring.hvoid main() struct stud char *n
19、um; char name20; float score; ; struct stud stu1,*sp; sp=&stu1; sp-num=04780601; strcpy(*sp).name,liling); stu1.score=90.0; printf(nstudent no.: %snname: %snscore: %.1f,sp-num,sp-name,sp-score); printf(nstudent no.: %stname: %stscore: %.1f, (*sp).num, (*sp).name, (*sp).score); printf(nstudent no.: %
20、stname: %stscore: %.1f, stu1.num,,stu1.score); 04780601liling90.0sp指向結(jié)構(gòu)體變量的指針指向結(jié)構(gòu)體變量的指針注意:(1) *sp兩側(cè)的括號不可省,因?yàn)槌蓡T運(yùn)算符“.”優(yōu)先于“*”運(yùn)算符,*sp.num就等價(jià)于*(sp.num)了。(2) 由于運(yùn)算符“-”、“.”、“()”和“”的優(yōu)先級最高,其結(jié)合性相同。例如: +sp-num等價(jià)于:+(sp-num)即成員值加1。 (+sp)-num:先執(zhí)行sp=sp+1,再執(zhí)行sp-num(注意sp的值已經(jīng)改變)。 sp+-num或(sp+)-num:先存取sp-num,再
21、執(zhí)行 sp=sp+1。 sp-num+:先存取sp-num,再使成員值加1。8.3.2 指向結(jié)構(gòu)數(shù)組的指針指向結(jié)構(gòu)數(shù)組的指針#includestruct student long int num; char name20; char sex; int age;stu3=80101,lilin,m,18,80102,yanglan,f,19, 80103,zhangjun,f,20;void main() struct student *p; /* p是指向struct student型數(shù)據(jù)的指針變量 */ printf(nno.tnamettsextagen); for(p=stu;pnum,
22、p-name, p-sex, p-age);運(yùn)行結(jié)果: no name sex age 80101 lilin m 18 80102 yanglan 19 80103 zhangjun 20pppstu2stu1stu0指向結(jié)構(gòu)數(shù)組的指針及其移動(dòng)示意指向結(jié)構(gòu)數(shù)組的指針及其移動(dòng)示意8.3.3 結(jié)構(gòu)體變量做函數(shù)參數(shù)結(jié)構(gòu)體變量做函數(shù)參數(shù) 1用結(jié)構(gòu)體變量的成員作參數(shù)。 例如,用stu1.num或作函數(shù)實(shí)參,將實(shí)參值傳給形參,“值傳遞”方式。 2用結(jié)構(gòu)體變量作實(shí)參。 采用“值傳遞”方式,將結(jié)構(gòu)體變量所占的內(nèi)存單元的內(nèi)容全部順序傳遞給形參。 例:有一個(gè)結(jié)構(gòu)體變量stu1,內(nèi)含學(xué)生學(xué)號、姓
23、名、數(shù)學(xué)和英語兩門課的成績。要求在main函數(shù)中賦值,在函數(shù)print中將它們打印輸出。#include#includestruct student long int num; char name20; float math; float eng; ;void main()void print(struct student); struct student stu1; stu1.num=80601; strcpy(,liling); stu1.math=80.5; stu1.eng=90; print(stu1);void print(struct student stu)
24、printf(%ldn%sn%.1fn%.1fn , stu.num,,stu.math,stu.eng); 3. 結(jié)構(gòu)變量(或數(shù)組)的地址作為實(shí)參傳遞給形參 例:將上例改用指向結(jié)構(gòu)體變量的指針作實(shí)參。#include#include#define format %ldn%sn%.1fn%.1fnstruct student long int num; char name20; float math; float eng;void main() struct student stu1=80601, liling, 80.5, 90 , *sp=&stu1;void print(
25、struct student *); /* 形參類型修改成指向結(jié)構(gòu)體的指針變量 */print(sp); /* 也可表示為 print(&stu1); 實(shí)質(zhì)都一樣即實(shí)參為stu1的起始地址 */ void print(struct student *p) /* 形參類型修改了 */ printf(format, p-num, p-name, p-math, p-eng); /* 用指針變量調(diào)用各成員之值 */ printf(n);stu1numnamemathengspp結(jié)構(gòu)體指針作函數(shù)參數(shù)結(jié)構(gòu)體指針作函數(shù)參數(shù)8.4 結(jié)構(gòu)數(shù)組應(yīng)用舉例結(jié)構(gòu)數(shù)組應(yīng)用舉例例: 候選人得票的統(tǒng)計(jì)。設(shè)有3個(gè)候選人,要選
26、擇其中的一人當(dāng)班長。從鍵盤上輸入得票的候選人的名字,輸出最終的得票結(jié)果。#includestdio.h#includestring.hstruct personchar name10; int count;leader3=chen,0,yang,0,zhou,0;void main() int i,j; char name20; /* 存放被選中候選人的姓名 */ for (i=1;i=10;i+) scanf(%s,name); for(j=0;j3;j+) if(strcmp(name,)=0) leaderj.count+; printf(n); for(i=0;
27、i成員名#includestdio.hunion mydata int i; char ch; float f; data1,*p=&data1;main() data1.i=20; printf(%d,%d,%dn,data1.i,p-i,(*p).i); data1.ch=m; printf(%c,%c,%cn,data1.ch,p-ch,(*p).ch); data1.f=80.5; printf(%f,%f,%fn,data1.f,p-f,(*p).f);8.5.2 使用共用體變量應(yīng)注意的使用共用體變量應(yīng)注意的問題問題 (1) 參與運(yùn)算或操作的是共用體變量的某個(gè)成員,不能是共用體變量整
28、體 例如:printf(%d, data1); 是錯(cuò)誤的。應(yīng)寫成“printf(”%d“, data1.i);”或 “printf(%c, data1.ch);”等。 (2) 同一個(gè)內(nèi)存段可以用來存放幾種不同類型的成員,但在每一瞬時(shí)只能存放其中一種,而不是同時(shí)存放幾種。例如: data1.i=20;data1.ch=m;data1.f=80.5;在完成以上3個(gè)賦值運(yùn)算以后,只有data1.f是有效的 (3) 共用體變量的地址和它的各成員的地址都是同一地址 (4) 不能在定義共用體變量時(shí)對它初始化,也不能對共用體變量名賦值。例如,下面這些都是不對的: union int i; char ch;
29、float f; a=2, m, 6.5; /* 不能初始化 */ a=2; /* 不能對共用體變量賦值 */ (5) 不能把共用體變量作為函數(shù)參數(shù),也不能使函數(shù)帶回共用體變量,但可以使用指向共用體變量的指針(與結(jié)構(gòu)體變量這種用法相仿)。8.6 枚舉枚舉 8.6.1 枚舉類型的概念及其定義枚舉類型的概念及其定義 枚舉類型的概念 列舉出所有可能的取值的一種數(shù)據(jù)結(jié)構(gòu)。 枚舉類型的定義 enum枚舉名枚舉元素1,枚舉元素2,枚舉元素n; 如:enum weekdaysun, mon, tue, wed, thu, fri, sat; enum weekday weekend, workday; 或:enum weekdaysun,mon,tue,wed,thu,fri,satworkday; 或: enum sun,mon,tue,wed,thu,fri,satworkday; 枚舉類型變量的賦值和使用 (1) 枚舉值是常量,不是變量; sun=5; mon=2; sun=mon; 均是錯(cuò)誤的。 (2)枚舉類型是有序數(shù)據(jù)類型; 如:weekday中,sun為0,mon為1,sat為6。 再如: main(
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 《建設(shè)人力資源強(qiáng)國》課件
- 2024年預(yù)拌混凝土產(chǎn)業(yè)鏈上下游合作協(xié)議3篇
- 航空航天飛行器用電磁純鐵
- 《貨幣的含義和本質(zhì)》課件
- 2024校園環(huán)境衛(wèi)生管理合同3篇
- 2024年貨品居間交易協(xié)議
- 2024年跨國海上貿(mào)易運(yùn)輸合作協(xié)議
- 2024年裝修施工安全合同3篇
- 2024年離婚雙方財(cái)產(chǎn)分割合同參考樣本版B版
- 2024年物業(yè)維修養(yǎng)護(hù)合同
- 耕地資源與國家糧食安全高中地理湘教版(2019)選擇性必修3
- 換熱器課程設(shè)計(jì)
- 部編版三年級語文上冊期末試卷(含答案)
- 公司扭虧解困方案
- 大型儲(chǔ)罐施工工法倒裝法安裝
- 氫能與燃料電池電動(dòng)汽車第5章 氫與燃料電池
- 餐飲店購銷合同
- 文化資源數(shù)字化技術(shù)有哪些
- 2023年杭州聯(lián)合銀行校園招聘筆試歷年高頻考點(diǎn)試題答案詳解
- 灌裝軋蓋機(jī)和供瓶機(jī)設(shè)備驗(yàn)證方案
- 《國家中藥飲片炮制規(guī)范》全文
評論
0/150
提交評論