第九章結(jié)構(gòu)體共用體_第1頁(yè)
第九章結(jié)構(gòu)體共用體_第2頁(yè)
第九章結(jié)構(gòu)體共用體_第3頁(yè)
第九章結(jié)構(gòu)體共用體_第4頁(yè)
第九章結(jié)構(gòu)體共用體_第5頁(yè)
已閱讀5頁(yè),還剩23頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

第九章結(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)識(shí)符的自定義9.9本章要點(diǎn)小結(jié)2/28§9.1結(jié)構(gòu)體的定義及引用9.1.1概述有時(shí)候需要將不同類型的數(shù)據(jù)組合成一個(gè)有機(jī)的整體,這些組合在一個(gè)整體中的數(shù)據(jù)是互相聯(lián)系的。如一個(gè)學(xué)生的信息包括學(xué)號(hào)、姓名、性別、年齡、成績(jī)、地址等。numnamesexagescoreaddr5001LiMingM1996.5Chengduintnum;charname[20];charsex;intage;floatscore;charaddr[30];應(yīng)當(dāng)把它們組織成一個(gè)組合項(xiàng),在一個(gè)組合項(xiàng)內(nèi)包含若干個(gè)類型不同(或相同)的數(shù)據(jù)項(xiàng)。

C語(yǔ)言提供了這種數(shù)據(jù)結(jié)構(gòu):允許用戶將不同類型的數(shù)據(jù)組合成一個(gè)有機(jī)的整體,這些數(shù)據(jù)互相聯(lián)系;這種數(shù)據(jù)結(jié)構(gòu)稱為結(jié)構(gòu)體(structure)。3/289.1.2結(jié)構(gòu)體類型標(biāo)識(shí)符的定義所謂結(jié)構(gòu)體的定義,是指定義相應(yīng)的數(shù)據(jù)結(jié)構(gòu)及相應(yīng)的變量。步驟:①、先定義一個(gè)結(jié)構(gòu)體類型標(biāo)識(shí)符;②、用該標(biāo)識(shí)符去定義相應(yīng)的變量。struct

student{

intnum;charname[20];charsex;

intage;floatscore;charaddr[30];};說(shuō)明:①、struct是關(guān)鍵字,不能省略:表示將要進(jìn)行結(jié)構(gòu)體的定義;②、student是用戶自己定義的結(jié)構(gòu)體類型標(biāo)識(shí)符,即該結(jié)構(gòu)體名;③、結(jié)構(gòu)體中具體每項(xiàng)的定義,由{和}括起來(lái)。C語(yǔ)言中把用戶自己定義的數(shù)據(jù)項(xiàng)稱為成員(或稱為域),即每個(gè)成員也叫結(jié)構(gòu)體中的一個(gè)域。4/28定義一個(gè)結(jié)構(gòu)體類型的一般形式:struct

結(jié)構(gòu)體類型標(biāo)識(shí)符{

類型標(biāo)識(shí)符1成員名1;類型標(biāo)識(shí)符2成員名2;…………類型標(biāo)識(shí)符n成員名n;};結(jié)構(gòu)體名成員表列說(shuō)明:①、“結(jié)構(gòu)體名”用作結(jié)構(gòu)體類型的標(biāo)志;②、大括弧內(nèi)是該結(jié)構(gòu)體中的各個(gè)成員,由它們組成一個(gè)結(jié)構(gòu)體;在結(jié)構(gòu)體內(nèi)對(duì)各成員都應(yīng)進(jìn)行類型聲明;③、“成員表列”也稱為域表。每個(gè)成員也稱為結(jié)構(gòu)體中的一個(gè)域,成員名命名規(guī)則與變量名一樣;④、每個(gè)成員名前的類型標(biāo)識(shí)符可以為已經(jīng)定義了的任意類型,當(dāng)然可以是結(jié)構(gòu)體類型標(biāo)識(shí)符,即結(jié)構(gòu)體成員也可以是另一個(gè)結(jié)構(gòu)體變量。⑤、此處只是構(gòu)造出一個(gè)新的類型,并沒有定義該類型的變量,因此在內(nèi)存中并沒有開辟任何存儲(chǔ)空間;⑥、在程序中可以定義多個(gè)結(jié)構(gòu)體類型,不同結(jié)構(gòu)體類型用不同的結(jié)構(gòu)體名來(lái)區(qū)分。5/289.1.3結(jié)構(gòu)體變量的定義1、定義形式:struct結(jié)構(gòu)體類型標(biāo)識(shí)符

變量名列表;注意:結(jié)構(gòu)體類型標(biāo)識(shí)符要和關(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)會(huì)為之分配內(nèi)存單元。sizeof(stu1)=2+20+4=266/28②、在定義結(jié)構(gòu)體類型的同時(shí)定義變量struct

結(jié)構(gòu)體類型標(biāo)識(shí)符{類型標(biāo)識(shí)符1成員名1;類型標(biāo)識(shí)符2成員名2;…………類型標(biāo)識(shí)符n成員名n;}變量名列表;struct

student{

intnum;charname[20];floatscore;}stu1,stu2;③、直接定義結(jié)構(gòu)體類型變量struct{類型標(biāo)識(shí)符1成員名1;類型標(biāo)識(shí)符2成員名2;…………類型標(biāo)識(shí)符n成員名n;}變量名列表;(不出現(xiàn)結(jié)構(gòu)體類型名)struct{

intnum;charname[20];floatscore;}stu1,stu2;7/284、關(guān)于結(jié)構(gòu)體類型的幾點(diǎn)說(shuō)明:①、類型與變量是不同的概念,不要混淆:a、只能對(duì)變量賦值、存取或運(yùn)算,而不能對(duì)一個(gè)類型賦值、存取或運(yùn)算;b、在編譯時(shí),對(duì)類型不分配內(nèi)存空間,只對(duì)變量分配空間。②、只有在定義變量后,才為該變量開辟存儲(chǔ)單元。結(jié)構(gòu)體變量所占的內(nèi)存長(zhǎng)度等于每個(gè)成員長(zhǎng)度之和;struct

student{

intnum;charname[20];floatscore;};sizeof(structstudent)=26③、對(duì)結(jié)構(gòu)體中的成員(“域”),可以單獨(dú)使用,它的作用與地位相當(dāng)于普通變量;8/28④、成員也可以是一個(gè)已定義的結(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;};⑥、成員名可以與程序中的變量名相同,二者不代表同一對(duì)象。9/289.1.4結(jié)構(gòu)體變量的引用1、引用形式:結(jié)構(gòu)體變量名.成員名“.”是成員運(yùn)算符,在所有的運(yùn)算符中優(yōu)先級(jí)最高。struct

student{

intnum;charname[20];floatscore;}stu1,stu2;stu1.num=10001;stu1.score=95;="LiMing";strcpy(,"LiMing");2、不能將一個(gè)結(jié)構(gòu)體變量作為一個(gè)整體進(jìn)體輸入輸出:printf("%d%s%f",stu1);scanf("%d%s%f",&stu1);只能對(duì)結(jié)構(gòu)體中的各個(gè)成員分別進(jìn)行輸入輸出。printf("%d%s%f",stu1.num,,stu1.score);scanf("%d",&stu1.num);gets();Eg901.cpp10/28成員名也是一個(gè)變量(稱為成員變量),具有自己的數(shù)據(jù)類型,使用與同類型的變量相同。3、只有在對(duì)結(jié)構(gòu)體變量賦值或作為函數(shù)參數(shù)時(shí)才可以對(duì)一個(gè)結(jié)構(gòu)體變量進(jìn)行整體操作;(賦值時(shí)要求具有相同結(jié)構(gòu))stu2=stu1;stu2.num=stu1.num;strcpy(stu2,name,);stu2.score=stu1.score;voidfun(structstudent

px);fun(stu1);4、如果成員本身又屬于一個(gè)結(jié)構(gòu)體類型,則要用若干個(gè)成員運(yùn)算符,一級(jí)一級(jí)的找到最低一級(jí)的成員。只能對(duì)最低一級(jí)的成員進(jìn)行賦值、存取或運(yùn)算;stu1.birthday.year=2002;5、對(duì)成員變量可以像普通變量一樣進(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)體變量的同時(shí),可以進(jìn)行初始化。structstudent{intnum;charname[20];charsex;charaddr[30];}stu={15001,"宋紅",'M',"123RoadBeijing"};注意:結(jié)構(gòu)體變量的各個(gè)初值用大括號(hào){、}括起來(lái),大括號(hào)內(nèi)各個(gè)成員變量的值之間用逗號(hào)分隔,其值必須與成員變量一一對(duì)應(yīng),且數(shù)據(jù)類型應(yīng)與成員變量一致。Eg902.cpp例9.1:輸入5名學(xué)生的學(xué)號(hào)及成績(jī),求成績(jī)最好的學(xué)生的學(xué)號(hào)及成績(jī)。12/28§9.2結(jié)構(gòu)體數(shù)組數(shù)組的每個(gè)元素都是結(jié)構(gòu)體類型的數(shù)據(jù),它們分別包含各個(gè)成員項(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)體類型的同時(shí)定義結(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)識(shí)符{類型標(biāo)識(shí)符1成員名1;類型標(biāo)識(shí)符2成員名2;

……

……類型標(biāo)識(shí)符n成員名n;}結(jié)構(gòu)體數(shù)組={{數(shù)組元素0的各個(gè)初值},

{數(shù)組元素1的各個(gè)初值},……};例:structstudent{intnum;charname[20];floatscore;}stu[3]={{10101,"LiMing",

88},{10102,"ZhangJin",92},{10103,"WangLin",98.5}};14/28說(shuō)明:1、初始化時(shí),數(shù)組元素的個(gè)數(shù)可以不指定,系統(tǒng)會(huì)根據(jù)初值的結(jié)構(gòu)體常量的個(gè)數(shù)來(lái)確定數(shù)組元素的個(gè)數(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ù)組中各個(gè)元素的初值用大括號(hào){、}括起來(lái),同一數(shù)組元素的各個(gè)成員變量的初值用逗號(hào)分隔。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",寫出所用到的語(yǔ)句;②、要把'z'、'h'、‘b'變成大寫,如何實(shí)現(xiàn)?③、如何將stu[1]中的名字復(fù)制到stu[0]中的相應(yīng)位置上?2、設(shè)李紅、王建、趙明三名同學(xué)某學(xué)年考了8門課,要求分別統(tǒng)計(jì)出這3名同學(xué)該學(xué)年的總成績(jī),并按8門課總成績(jī)的高低排序輸出。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)體變量的某個(gè)成員。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、說(shuō)明:①、“->”為指向運(yùn)算符,是優(yōu)先級(jí)最高的運(yùn)算符;②、成員運(yùn)算符“.”的優(yōu)先級(jí)高于指針運(yùn)算符“*”,因此采用“(*p).成員名”形式時(shí),括號(hào)不能省略;③、注意以下幾種運(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只能指向一個(gè)structstudent類型的數(shù)據(jù)(某個(gè)元素的的起始地址),不能指向一個(gè)成員變量。注意:①、若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ù)將一個(gè)結(jié)構(gòu)體變量的值傳遞給另一個(gè)函數(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)體變量。例:有一個(gè)結(jié)構(gòu)變量stu,內(nèi)含學(xué)生學(xué)號(hào)、姓名、和3門課的成績(jī),在main函數(shù)中賦值,在另一函數(shù)print中打印輸出。③、用指向結(jié)構(gòu)體變量(或數(shù)組)的指針作實(shí)參:將結(jié)構(gòu)體變量(或數(shù)組)的地址傳給形參Eg906.cpp20/28§9.6枚舉類型9.6.1枚舉類型的定義所謂“枚舉”是指將變量的所有取值一一列舉出來(lái),變量的值只限于列舉出來(lái)的值的范圍內(nèi)。枚舉類型變量的定義:1、先定義枚舉類型標(biāo)識(shí)符,再定義變量enum

枚舉類型標(biāo)識(shí)符{枚舉元素1,枚舉元素2,……,枚舉元素n};enum

枚舉類型標(biāo)識(shí)符

變量列表;enumperson{Man,Woman};enumpersonx;enumweekday{Sun,Mon,Tue,Wed,Thu,Fri,Sat};enumweekdayworkday,weekend;21/282、直接定義枚舉變量enum

枚舉類型標(biāo)識(shí)符{枚舉元素1,枚舉元素2,……,

枚舉元素n}變量列表;enumperson{Man,Woman}x;enumweekday{Sun,Mon,Tue,Wed,Thu,Fri,Sat}workday,weekend;enumBOOL{FALSE,TRUE};3、說(shuō)明:Sun、Mon、……、Sat等稱為枚舉元素或枚舉常量,它們是用戶自定義標(biāo)識(shí)符。這些標(biāo)識(shí)符并不自動(dòng)的代表什么含義,用什么標(biāo)識(shí)符代表什么含義,完全由程序員決定,并在程序中作相應(yīng)的處理。22/289.6.2枚舉變量的引用1、在C編譯時(shí),對(duì)枚舉元素按常量處理,故稱枚舉常量。它們不是常量,不能對(duì)它們賦值。Sun=0;TRUE=1;2、枚舉元素作為常量,它們是有值的。C語(yǔ)言編譯時(shí)按定義時(shí)的順序使它們的值為0、1、2、……enumweekday{Sun,Mon,Tue,Wed,Thu,Fri,Sat}workday;workday=Mon;printf("%d",workday);3、可以在定義時(shí)改變枚舉元素的值enumweekday{Sun=7,Mon=1,Tue,Wed,Thu,Fri,Sat}workday;enumweekday{Sun=7,Mon,Tue,Wed=0,Thu,Fri,Sat};4、枚舉值可以用來(lái)做判斷比較if(workday==Mon)……if(workday>Sun)……23/285、一個(gè)整數(shù)不能直接賦給一個(gè)枚舉變量workday=2;workday=(enumweekday)2;workday=(enumweekday)(x-y);例:從鍵盤輸入0~6的任意整數(shù),0表示星期日,1~6分別表示星期一到星期六,要求編寫程序輸出對(duì)應(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)識(shí)符的自定義1、除了可以直接使用C提供的標(biāo)準(zhǔn)類型名(int、char、float等)和自己定義的數(shù)據(jù)類型(結(jié)構(gòu)體、共用體、指針、枚舉類型)外,還可以用typedef聲明新的類型名來(lái)代替已有的類型名。typedef

int

INTEGERint

i,*p;INTEGERi,*p;typedef

float

REALfloatx,y;REALx,y;2、定義類型標(biāo)識(shí)符的方法:①、按定義變量的方式寫出定義體:floatx;②、將變量名換成新的類型標(biāo)識(shí)符:REALx;③、在最前面加typedef:typedef

REALx;3、例:25/28⑴、定義含有10個(gè)元素的整型數(shù)組:①、先按照定義數(shù)組的形式書寫:int

溫馨提示

  • 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ù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論