版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
第九章結(jié)構(gòu)體、共用體、枚舉類型1/289.1結(jié)構(gòu)體的定義及引用9.2結(jié)構(gòu)體數(shù)組9.3結(jié)構(gòu)體與指針9.5共用體的概念9.6枚舉類型9.7類型標(biāo)識符的自定義9.9本章要點(diǎn)小結(jié)2/28§9.1結(jié)構(gòu)體的定義及引用9.1.1概述有時候需要將不同類型的數(shù)據(jù)組合成一個有機(jī)的整體,這些組合在一個整體中的數(shù)據(jù)是互相聯(lián)系的。如一個學(xué)生的信息包括學(xué)號、姓名、性別、年齡、成績、地址等。numnamesexagescoreaddr5001LiMingM1996.5Chengduintnum;charname[20];charsex;intage;floatscore;charaddr[30];應(yīng)當(dāng)把它們組織成一個組合項(xiàng),在一個組合項(xiàng)內(nèi)包含若干個類型不同(或相同)的數(shù)據(jù)項(xiàng)。
C語言提供了這種數(shù)據(jù)結(jié)構(gòu):允許用戶將不同類型的數(shù)據(jù)組合成一個有機(jī)的整體,這些數(shù)據(jù)互相聯(lián)系;這種數(shù)據(jù)結(jié)構(gòu)稱為結(jié)構(gòu)體(structure)。3/289.1.2結(jié)構(gòu)體類型標(biāo)識符的定義所謂結(jié)構(gòu)體的定義,是指定義相應(yīng)的數(shù)據(jù)結(jié)構(gòu)及相應(yīng)的變量。步驟:①、先定義一個結(jié)構(gòu)體類型標(biāo)識符;②、用該標(biāo)識符去定義相應(yīng)的變量。struct
student{
intnum;charname[20];charsex;
intage;floatscore;charaddr[30];};說明:①、struct是關(guān)鍵字,不能省略:表示將要進(jìn)行結(jié)構(gòu)體的定義;②、student是用戶自己定義的結(jié)構(gòu)體類型標(biāo)識符,即該結(jié)構(gòu)體名;③、結(jié)構(gòu)體中具體每項(xiàng)的定義,由{和}括起來。C語言中把用戶自己定義的數(shù)據(jù)項(xiàng)稱為成員(或稱為域),即每個成員也叫結(jié)構(gòu)體中的一個域。4/28定義一個結(jié)構(gòu)體類型的一般形式:struct
結(jié)構(gòu)體類型標(biāo)識符{
類型標(biāo)識符1成員名1;類型標(biāo)識符2成員名2;…………類型標(biāo)識符n成員名n;};結(jié)構(gòu)體名成員表列說明:①、“結(jié)構(gòu)體名”用作結(jié)構(gòu)體類型的標(biāo)志;②、大括弧內(nèi)是該結(jié)構(gòu)體中的各個成員,由它們組成一個結(jié)構(gòu)體;在結(jié)構(gòu)體內(nèi)對各成員都應(yīng)進(jìn)行類型聲明;③、“成員表列”也稱為域表。每個成員也稱為結(jié)構(gòu)體中的一個域,成員名命名規(guī)則與變量名一樣;④、每個成員名前的類型標(biāo)識符可以為已經(jīng)定義了的任意類型,當(dāng)然可以是結(jié)構(gòu)體類型標(biāo)識符,即結(jié)構(gòu)體成員也可以是另一個結(jié)構(gòu)體變量。⑤、此處只是構(gòu)造出一個新的類型,并沒有定義該類型的變量,因此在內(nèi)存中并沒有開辟任何存儲空間;⑥、在程序中可以定義多個結(jié)構(gòu)體類型,不同結(jié)構(gòu)體類型用不同的結(jié)構(gòu)體名來區(qū)分。5/289.1.3結(jié)構(gòu)體變量的定義1、定義形式:struct結(jié)構(gòu)體類型標(biāo)識符
變量名列表;注意:結(jié)構(gòu)體類型標(biāo)識符要和關(guān)鍵字struct一起使用。2、定義結(jié)構(gòu)體變量的三種方法:①、先定義結(jié)構(gòu)體類型再定義變量名struct
student{
intnum;charname[20];floatscore;};structstudentstu1,stu2;結(jié)構(gòu)體類型名結(jié)構(gòu)體變量名10001Zhang9210002Li97stu1stu2在定義了結(jié)構(gòu)體變量后,系統(tǒng)會為之分配內(nèi)存單元。sizeof(stu1)=2+20+4=266/28②、在定義結(jié)構(gòu)體類型的同時定義變量struct
結(jié)構(gòu)體類型標(biāo)識符{類型標(biāo)識符1成員名1;類型標(biāo)識符2成員名2;…………類型標(biāo)識符n成員名n;}變量名列表;struct
student{
intnum;charname[20];floatscore;}stu1,stu2;③、直接定義結(jié)構(gòu)體類型變量struct{類型標(biāo)識符1成員名1;類型標(biāo)識符2成員名2;…………類型標(biāo)識符n成員名n;}變量名列表;(不出現(xiàn)結(jié)構(gòu)體類型名)struct{
intnum;charname[20];floatscore;}stu1,stu2;7/284、關(guān)于結(jié)構(gòu)體類型的幾點(diǎn)說明:①、類型與變量是不同的概念,不要混淆:a、只能對變量賦值、存取或運(yùn)算,而不能對一個類型賦值、存取或運(yùn)算;b、在編譯時,對類型不分配內(nèi)存空間,只對變量分配空間。②、只有在定義變量后,才為該變量開辟存儲單元。結(jié)構(gòu)體變量所占的內(nèi)存長度等于每個成員長度之和;struct
student{
intnum;charname[20];floatscore;};sizeof(structstudent)=26③、對結(jié)構(gòu)體中的成員(“域”),可以單獨(dú)使用,它的作用與地位相當(dāng)于普通變量;8/28④、成員也可以是一個已定義的結(jié)構(gòu)體類型變量:structdate{
intyear;
intmonth;
intday;};struct
student{
intnum;charname[20];charsex;
structdatebirthday;charaddr[30];};sizeof(structstudent)=?⑤、成員也可以是指向本結(jié)構(gòu)體類型的指針變量;structstudent{intnum;charname[20];floatscore;
structstudent
*next;};⑥、成員名可以與程序中的變量名相同,二者不代表同一對象。9/289.1.4結(jié)構(gòu)體變量的引用1、引用形式:結(jié)構(gòu)體變量名.成員名“.”是成員運(yùn)算符,在所有的運(yùn)算符中優(yōu)先級最高。struct
student{
intnum;charname[20];floatscore;}stu1,stu2;stu1.num=10001;stu1.score=95;="LiMing";strcpy(,"LiMing");2、不能將一個結(jié)構(gòu)體變量作為一個整體進(jìn)體輸入輸出:printf("%d%s%f",stu1);scanf("%d%s%f",&stu1);只能對結(jié)構(gòu)體中的各個成員分別進(jìn)行輸入輸出。printf("%d%s%f",stu1.num,,stu1.score);scanf("%d",&stu1.num);gets();Eg901.cpp10/28成員名也是一個變量(稱為成員變量),具有自己的數(shù)據(jù)類型,使用與同類型的變量相同。3、只有在對結(jié)構(gòu)體變量賦值或作為函數(shù)參數(shù)時才可以對一個結(jié)構(gòu)體變量進(jìn)行整體操作;(賦值時要求具有相同結(jié)構(gòu))stu2=stu1;stu2.num=stu1.num;strcpy(stu2,name,);stu2.score=stu1.score;voidfun(structstudent
px);fun(stu1);4、如果成員本身又屬于一個結(jié)構(gòu)體類型,則要用若干個成員運(yùn)算符,一級一級的找到最低一級的成員。只能對最低一級的成員進(jìn)行賦值、存取或運(yùn)算;stu1.birthday.year=2002;5、對成員變量可以像普通變量一樣進(jìn)行各種運(yùn)算(根據(jù)其類型決定可以進(jìn)行的運(yùn)算)sum=stu1.score+stu2.score;stu1.age++;11/286、可以引用結(jié)構(gòu)體變量成員的地址,也可以引用結(jié)構(gòu)體變量的地址;scanf("%d",&stu1.num);printf("%x",&stu1);結(jié)構(gòu)體變量的地址主要用于作函數(shù)參數(shù),傳遞結(jié)構(gòu)體變量的地址;7、在定義結(jié)構(gòu)體變量的同時,可以進(jìn)行初始化。structstudent{intnum;charname[20];charsex;charaddr[30];}stu={15001,"宋紅",'M',"123RoadBeijing"};注意:結(jié)構(gòu)體變量的各個初值用大括號{、}括起來,大括號內(nèi)各個成員變量的值之間用逗號分隔,其值必須與成員變量一一對應(yīng),且數(shù)據(jù)類型應(yīng)與成員變量一致。Eg902.cpp例9.1:輸入5名學(xué)生的學(xué)號及成績,求成績最好的學(xué)生的學(xué)號及成績。12/28§9.2結(jié)構(gòu)體數(shù)組數(shù)組的每個元素都是結(jié)構(gòu)體類型的數(shù)據(jù),它們分別包含各個成員項(xiàng)。9.2.1結(jié)構(gòu)體數(shù)組的定義1、先定義結(jié)構(gòu)體類型,再定義結(jié)構(gòu)體數(shù)組structstudent{intnum;floatscore;};structstudent
stu[30];2、定義結(jié)構(gòu)體類型的同時定義結(jié)構(gòu)體數(shù)組structstudent{intnum;floatscore;}stu[30];3、直接定義結(jié)構(gòu)體數(shù)組struct{intnum;floatscore;}stu[30];13/289.2.2結(jié)構(gòu)體數(shù)組的初始化一般形式:struct
結(jié)構(gòu)體類型標(biāo)識符{類型標(biāo)識符1成員名1;類型標(biāo)識符2成員名2;
……
……類型標(biāo)識符n成員名n;}結(jié)構(gòu)體數(shù)組={{數(shù)組元素0的各個初值},
{數(shù)組元素1的各個初值},……};例:structstudent{intnum;charname[20];floatscore;}stu[3]={{10101,"LiMing",
88},{10102,"ZhangJin",92},{10103,"WangLin",98.5}};14/28說明:1、初始化時,數(shù)組元素的個數(shù)可以不指定,系統(tǒng)會根據(jù)初值的結(jié)構(gòu)體常量的個數(shù)來確定數(shù)組元素的個數(shù);structstudent{intnum;charname[20];floatscore;}stu[]={{10101,"LiMing",
88},{10102,"ZhangJin",92},
{10103,"WangLin",98.5}};structstudent{intnum;charname[20];floatscore;};stu[]={{10101,"LiMing",
88},
{10102,"ZhangJin",92},
{10103,"WangLin",98.5}};2、數(shù)組中各個元素的初值用大括號{、}括起來,同一數(shù)組元素的各個成員變量的初值用逗號分隔。15/289.2.3結(jié)構(gòu)體數(shù)組應(yīng)用舉例1、若有如下定義:struct
aa{longnum;charname[20];};structbb{intage;
struct
aa
first;}stu[2];①、要給stu[1]輸入18、990001、"zhanghuabin",寫出所用到的語句;②、要把'z'、'h'、‘b'變成大寫,如何實(shí)現(xiàn)?③、如何將stu[1]中的名字復(fù)制到stu[0]中的相應(yīng)位置上?2、設(shè)李紅、王建、趙明三名同學(xué)某學(xué)年考了8門課,要求分別統(tǒng)計出這3名同學(xué)該學(xué)年的總成績,并按8門課總成績的高低排序輸出。Eg903.cpp16/28§9.3結(jié)構(gòu)體與指針結(jié)構(gòu)體變量的指針就是該變量所占據(jù)的內(nèi)存段的起始地址。9.3.1指向結(jié)構(gòu)體變量的指針1、指向結(jié)構(gòu)體變量指針的定義:structstudent{intnum;charname[20];floatscore;};structstudent
stu,*p;p=&stu;p中存放著結(jié)構(gòu)體變量stu在內(nèi)存中的首地址注意:不能用指向結(jié)構(gòu)體變量的指針指向該結(jié)構(gòu)體變量的某個成員。p=&stu.num;int*ip;ip=&stu.num;17/28①、stu.num、、stu.score②、(*p).num、(*p).name、(*p).score③、p->num、p->name、p->score2、訪問結(jié)構(gòu)體成員變量的三種方法:3、說明:①、“->”為指向運(yùn)算符,是優(yōu)先級最高的運(yùn)算符;②、成員運(yùn)算符“.”的優(yōu)先級高于指針運(yùn)算符“*”,因此采用“(*p).成員名”形式時,括號不能省略;③、注意以下幾種運(yùn)算:p->num得到p指向的結(jié)構(gòu)體變量中的成員num的值p->num++得到p指向的結(jié)構(gòu)體變量中的成員num的值,用完后該值加1++p->num使p指向的結(jié)構(gòu)體變量中的成員num的值加14、例:指向結(jié)構(gòu)體變量的指針的應(yīng)用Eg904.cpp18/289.3.2指向結(jié)構(gòu)體數(shù)組的指針指向結(jié)構(gòu)體變量的指針變量,可以指向結(jié)構(gòu)體變量,也可以指向同類型的結(jié)構(gòu)體數(shù)組的元素。structstudent{intnum;charname[30];floatscore;}stu[30],*p;p=stu;p=&stu[3];p=&stu[2].num;p只能指向一個structstudent類型的數(shù)據(jù)(某個元素的的起始地址),不能指向一個成員變量。注意:①、若p的初值為stu,p+1后指向下一元素的起始地址;(++p)->num先使p自加1,然后得到它指向元素的num成員值++p->num使p指向的結(jié)構(gòu)體變量中的成員num的值加1(p++)->num先得到p->num的值,然后使p自加1,指向stu[1]p->nunm++使p指向的結(jié)構(gòu)體變量中的成員num的值加1②、若p已定義為指向結(jié)構(gòu)體類型的數(shù)據(jù),則p只能指向相應(yīng)類型的變量或數(shù)組元素,不能指向數(shù)組元素中的某一成員;Eg905.cpp19/289.3.3結(jié)構(gòu)體指針作為函數(shù)參數(shù)將一個結(jié)構(gòu)體變量的值傳遞給另一個函數(shù),有3種辦法:①、用結(jié)構(gòu)體變量的成員作參數(shù):將實(shí)參值傳遞給形參,屬于“值傳遞”方式(注意實(shí)參與形參的類型保持一致)。fun(stu.num);voidfun(int);②、用結(jié)構(gòu)體變量作實(shí)參:采取的是“值傳遞”方式,將結(jié)構(gòu)體變量所占的內(nèi)存單元的內(nèi)容全部順序傳遞給形參。要求形參也必須是同類型的結(jié)構(gòu)體變量。例:有一個結(jié)構(gòu)變量stu,內(nèi)含學(xué)生學(xué)號、姓名、和3門課的成績,在main函數(shù)中賦值,在另一函數(shù)print中打印輸出。③、用指向結(jié)構(gòu)體變量(或數(shù)組)的指針作實(shí)參:將結(jié)構(gòu)體變量(或數(shù)組)的地址傳給形參Eg906.cpp20/28§9.6枚舉類型9.6.1枚舉類型的定義所謂“枚舉”是指將變量的所有取值一一列舉出來,變量的值只限于列舉出來的值的范圍內(nèi)。枚舉類型變量的定義:1、先定義枚舉類型標(biāo)識符,再定義變量enum
枚舉類型標(biāo)識符{枚舉元素1,枚舉元素2,……,枚舉元素n};enum
枚舉類型標(biāo)識符
變量列表;enumperson{Man,Woman};enumpersonx;enumweekday{Sun,Mon,Tue,Wed,Thu,Fri,Sat};enumweekdayworkday,weekend;21/282、直接定義枚舉變量enum
枚舉類型標(biāo)識符{枚舉元素1,枚舉元素2,……,
枚舉元素n}變量列表;enumperson{Man,Woman}x;enumweekday{Sun,Mon,Tue,Wed,Thu,Fri,Sat}workday,weekend;enumBOOL{FALSE,TRUE};3、說明:Sun、Mon、……、Sat等稱為枚舉元素或枚舉常量,它們是用戶自定義標(biāo)識符。這些標(biāo)識符并不自動的代表什么含義,用什么標(biāo)識符代表什么含義,完全由程序員決定,并在程序中作相應(yīng)的處理。22/289.6.2枚舉變量的引用1、在C編譯時,對枚舉元素按常量處理,故稱枚舉常量。它們不是常量,不能對它們賦值。Sun=0;TRUE=1;2、枚舉元素作為常量,它們是有值的。C語言編譯時按定義時的順序使它們的值為0、1、2、……enumweekday{Sun,Mon,Tue,Wed,Thu,Fri,Sat}workday;workday=Mon;printf("%d",workday);3、可以在定義時改變枚舉元素的值enumweekday{Sun=7,Mon=1,Tue,Wed,Thu,Fri,Sat}workday;enumweekday{Sun=7,Mon,Tue,Wed=0,Thu,Fri,Sat};4、枚舉值可以用來做判斷比較if(workday==Mon)……if(workday>Sun)……23/285、一個整數(shù)不能直接賦給一個枚舉變量workday=2;workday=(enumweekday)2;workday=(enumweekday)(x-y);例:從鍵盤輸入0~6的任意整數(shù),0表示星期日,1~6分別表示星期一到星期六,要求編寫程序輸出對應(yīng)的英文名稱。enumweekday{Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday}week;switch(week){caseSunday:……break;caseMonday:……break;caseTuesday:……break;caseWednesday:……break;caseThursday:……break;caseFriday:……break;caseSaturday:……break;}24/28§9.7類型標(biāo)識符的自定義1、除了可以直接使用C提供的標(biāo)準(zhǔn)類型名(int、char、float等)和自己定義的數(shù)據(jù)類型(結(jié)構(gòu)體、共用體、指針、枚舉類型)外,還可以用typedef聲明新的類型名來代替已有的類型名。typedef
int
INTEGERint
i,*p;INTEGERi,*p;typedef
float
REALfloatx,y;REALx,y;2、定義類型標(biāo)識符的方法:①、按定義變量的方式寫出定義體:floatx;②、將變量名換成新的類型標(biāo)識符:REALx;③、在最前面加typedef:typedef
REALx;3、例:25/28⑴、定義含有10個元素的整型數(shù)組:①、先按照定義數(shù)組的形式書寫:int
溫馨提示
- 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 《散射矩陣》課件
- 智慧工地規(guī)劃報告范文
- 倉庫報告范文
- 2025年達(dá)州貨車從業(yè)資格證理考試
- 2025年秦皇島客貨運(yùn)從業(yè)資格證考試教材
- 2025年商洛貨運(yùn)資格證試題及答案
- 2025年萍鄉(xiāng)貨運(yùn)從業(yè)資格考試
- 急性腔隙性腦梗塞治療
- 城建工作述職報告
- 《效用和偏好》課件
- 新概念英語第一冊Lesson13-14課件
- 廣東省廣州市2022年中考英語試題真題分類匯編:閱讀填空(含答案)
- 2023年惠州市交通投資集團(tuán)有限公司招聘筆試模擬試題及答案解析
- 紅外線治療儀
- 手術(shù)室護(hù)理工作-手術(shù)室的無菌操作原則及手術(shù)配合(課件ppt)
- 2021年青島幼兒師范高等??茖W(xué)校輔導(dǎo)員招聘試題及答案解析
- 五年級上冊英語課件-Unit4 What can you do Part A |人教(PEP) (共16張PPT)
- DB3302T 1124-2021 使用危險化學(xué)品工業(yè)企業(yè)安全生產(chǎn)基本規(guī)范
- 磁共振原理講解課件
- 葡萄糖無氧氧化課件
- 西方經(jīng)濟(jì)學(xué)章節(jié)練習(xí)題題庫及答案1-16章(全)
評論
0/150
提交評論