第九章結構體共用體_第1頁
第九章結構體共用體_第2頁
第九章結構體共用體_第3頁
第九章結構體共用體_第4頁
第九章結構體共用體_第5頁
已閱讀5頁,還剩23頁未讀, 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

第九章結構體、共用體、枚舉類型1/289.1結構體的定義及引用9.2結構體數組9.3結構體與指針9.5共用體的概念9.6枚舉類型9.7類型標識符的自定義9.9本章要點小結2/28§9.1結構體的定義及引用9.1.1概述有時候需要將不同類型的數據組合成一個有機的整體,這些組合在一個整體中的數據是互相聯系的。如一個學生的信息包括學號、姓名、性別、年齡、成績、地址等。numnamesexagescoreaddr5001LiMingM1996.5Chengduintnum;charname[20];charsex;intage;floatscore;charaddr[30];應當把它們組織成一個組合項,在一個組合項內包含若干個類型不同(或相同)的數據項。

C語言提供了這種數據結構:允許用戶將不同類型的數據組合成一個有機的整體,這些數據互相聯系;這種數據結構稱為結構體(structure)。3/289.1.2結構體類型標識符的定義所謂結構體的定義,是指定義相應的數據結構及相應的變量。步驟:①、先定義一個結構體類型標識符;②、用該標識符去定義相應的變量。struct

student{

intnum;charname[20];charsex;

intage;floatscore;charaddr[30];};說明:①、struct是關鍵字,不能省略:表示將要進行結構體的定義;②、student是用戶自己定義的結構體類型標識符,即該結構體名;③、結構體中具體每項的定義,由{和}括起來。C語言中把用戶自己定義的數據項稱為成員(或稱為域),即每個成員也叫結構體中的一個域。4/28定義一個結構體類型的一般形式:struct

結構體類型標識符{

類型標識符1成員名1;類型標識符2成員名2;…………類型標識符n成員名n;};結構體名成員表列說明:①、“結構體名”用作結構體類型的標志;②、大括弧內是該結構體中的各個成員,由它們組成一個結構體;在結構體內對各成員都應進行類型聲明;③、“成員表列”也稱為域表。每個成員也稱為結構體中的一個域,成員名命名規則與變量名一樣;④、每個成員名前的類型標識符可以為已經定義了的任意類型,當然可以是結構體類型標識符,即結構體成員也可以是另一個結構體變量。⑤、此處只是構造出一個新的類型,并沒有定義該類型的變量,因此在內存中并沒有開辟任何存儲空間;⑥、在程序中可以定義多個結構體類型,不同結構體類型用不同的結構體名來區分。5/289.1.3結構體變量的定義1、定義形式:struct結構體類型標識符

變量名列表;注意:結構體類型標識符要和關鍵字struct一起使用。2、定義結構體變量的三種方法:①、先定義結構體類型再定義變量名struct

student{

intnum;charname[20];floatscore;};structstudentstu1,stu2;結構體類型名結構體變量名10001Zhang9210002Li97stu1stu2在定義了結構體變量后,系統會為之分配內存單元。sizeof(stu1)=2+20+4=266/28②、在定義結構體類型的同時定義變量struct

結構體類型標識符{類型標識符1成員名1;類型標識符2成員名2;…………類型標識符n成員名n;}變量名列表;struct

student{

intnum;charname[20];floatscore;}stu1,stu2;③、直接定義結構體類型變量struct{類型標識符1成員名1;類型標識符2成員名2;…………類型標識符n成員名n;}變量名列表;(不出現結構體類型名)struct{

intnum;charname[20];floatscore;}stu1,stu2;7/284、關于結構體類型的幾點說明:①、類型與變量是不同的概念,不要混淆:a、只能對變量賦值、存取或運算,而不能對一個類型賦值、存取或運算;b、在編譯時,對類型不分配內存空間,只對變量分配空間。②、只有在定義變量后,才為該變量開辟存儲單元。結構體變量所占的內存長度等于每個成員長度之和;struct

student{

intnum;charname[20];floatscore;};sizeof(structstudent)=26③、對結構體中的成員(“域”),可以單獨使用,它的作用與地位相當于普通變量;8/28④、成員也可以是一個已定義的結構體類型變量:structdate{

intyear;

intmonth;

intday;};struct

student{

intnum;charname[20];charsex;

structdatebirthday;charaddr[30];};sizeof(structstudent)=?⑤、成員也可以是指向本結構體類型的指針變量;structstudent{intnum;charname[20];floatscore;

structstudent

*next;};⑥、成員名可以與程序中的變量名相同,二者不代表同一對象。9/289.1.4結構體變量的引用1、引用形式:結構體變量名.成員名“.”是成員運算符,在所有的運算符中優先級最高。struct

student{

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

px);fun(stu1);4、如果成員本身又屬于一個結構體類型,則要用若干個成員運算符,一級一級的找到最低一級的成員。只能對最低一級的成員進行賦值、存取或運算;stu1.birthday.year=2002;5、對成員變量可以像普通變量一樣進行各種運算(根據其類型決定可以進行的運算)sum=stu1.score+stu2.score;stu1.age++;11/286、可以引用結構體變量成員的地址,也可以引用結構體變量的地址;scanf("%d",&stu1.num);printf("%x",&stu1);結構體變量的地址主要用于作函數參數,傳遞結構體變量的地址;7、在定義結構體變量的同時,可以進行初始化。structstudent{intnum;charname[20];charsex;charaddr[30];}stu={15001,"宋紅",'M',"123RoadBeijing"};注意:結構體變量的各個初值用大括號{、}括起來,大括號內各個成員變量的值之間用逗號分隔,其值必須與成員變量一一對應,且數據類型應與成員變量一致。Eg902.cpp例9.1:輸入5名學生的學號及成績,求成績最好的學生的學號及成績。12/28§9.2結構體數組數組的每個元素都是結構體類型的數據,它們分別包含各個成員項。9.2.1結構體數組的定義1、先定義結構體類型,再定義結構體數組structstudent{intnum;floatscore;};structstudent

stu[30];2、定義結構體類型的同時定義結構體數組structstudent{intnum;floatscore;}stu[30];3、直接定義結構體數組struct{intnum;floatscore;}stu[30];13/289.2.2結構體數組的初始化一般形式:struct

結構體類型標識符{類型標識符1成員名1;類型標識符2成員名2;

……

……類型標識符n成員名n;}結構體數組={{數組元素0的各個初值},

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

88},{10102,"ZhangJin",92},{10103,"WangLin",98.5}};14/28說明:1、初始化時,數組元素的個數可以不指定,系統會根據初值的結構體常量的個數來確定數組元素的個數;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、數組中各個元素的初值用大括號{、}括起來,同一數組元素的各個成員變量的初值用逗號分隔。15/289.2.3結構體數組應用舉例1、若有如下定義:struct

aa{longnum;charname[20];};structbb{intage;

struct

aa

first;}stu[2];①、要給stu[1]輸入18、990001、"zhanghuabin",寫出所用到的語句;②、要把'z'、'h'、‘b'變成大寫,如何實現?③、如何將stu[1]中的名字復制到stu[0]中的相應位置上?2、設李紅、王建、趙明三名同學某學年考了8門課,要求分別統計出這3名同學該學年的總成績,并按8門課總成績的高低排序輸出。Eg903.cpp16/28§9.3結構體與指針結構體變量的指針就是該變量所占據的內存段的起始地址。9.3.1指向結構體變量的指針1、指向結構體變量指針的定義:structstudent{intnum;charname[20];floatscore;};structstudent

stu,*p;p=&stu;p中存放著結構體變量stu在內存中的首地址注意:不能用指向結構體變量的指針指向該結構體變量的某個成員。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、訪問結構體成員變量的三種方法:3、說明:①、“->”為指向運算符,是優先級最高的運算符;②、成員運算符“.”的優先級高于指針運算符“*”,因此采用“(*p).成員名”形式時,括號不能省略;③、注意以下幾種運算:p->num得到p指向的結構體變量中的成員num的值p->num++得到p指向的結構體變量中的成員num的值,用完后該值加1++p->num使p指向的結構體變量中的成員num的值加14、例:指向結構體變量的指針的應用Eg904.cpp18/289.3.2指向結構體數組的指針指向結構體變量的指針變量,可以指向結構體變量,也可以指向同類型的結構體數組的元素。structstudent{intnum;charname[30];floatscore;}stu[30],*p;p=stu;p=&stu[3];p=&stu[2].num;p只能指向一個structstudent類型的數據(某個元素的的起始地址),不能指向一個成員變量。注意:①、若p的初值為stu,p+1后指向下一元素的起始地址;(++p)->num先使p自加1,然后得到它指向元素的num成員值++p->num使p指向的結構體變量中的成員num的值加1(p++)->num先得到p->num的值,然后使p自加1,指向stu[1]p->nunm++使p指向的結構體變量中的成員num的值加1②、若p已定義為指向結構體類型的數據,則p只能指向相應類型的變量或數組元素,不能指向數組元素中的某一成員;Eg905.cpp19/289.3.3結構體指針作為函數參數將一個結構體變量的值傳遞給另一個函數,有3種辦法:①、用結構體變量的成員作參數:將實參值傳遞給形參,屬于“值傳遞”方式(注意實參與形參的類型保持一致)。fun(stu.num);voidfun(int);②、用結構體變量作實參:采取的是“值傳遞”方式,將結構體變量所占的內存單元的內容全部順序傳遞給形參。要求形參也必須是同類型的結構體變量。例:有一個結構變量stu,內含學生學號、姓名、和3門課的成績,在main函數中賦值,在另一函數print中打印輸出。③、用指向結構體變量(或數組)的指針作實參:將結構體變量(或數組)的地址傳給形參Eg906.cpp20/28§9.6枚舉類型9.6.1枚舉類型的定義所謂“枚舉”是指將變量的所有取值一一列舉出來,變量的值只限于列舉出來的值的范圍內。枚舉類型變量的定義:1、先定義枚舉類型標識符,再定義變量enum

枚舉類型標識符{枚舉元素1,枚舉元素2,……,枚舉元素n};enum

枚舉類型標識符

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

枚舉類型標識符{枚舉元素1,枚舉元素2,……,

枚舉元素n}變量列表;enumperson{Man,Woman}x;enumweekday{Sun,Mon,Tue,Wed,Thu,Fri,Sat}workday,weekend;enumBOOL{FALSE,TRUE};3、說明:Sun、Mon、……、Sat等稱為枚舉元素或枚舉常量,它們是用戶自定義標識符。這些標識符并不自動的代表什么含義,用什么標識符代表什么含義,完全由程序員決定,并在程序中作相應的處理。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、一個整數不能直接賦給一個枚舉變量workday=2;workday=(enumweekday)2;workday=(enumweekday)(x-y);例:從鍵盤輸入0~6的任意整數,0表示星期日,1~6分別表示星期一到星期六,要求編寫程序輸出對應的英文名稱。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類型標識符的自定義1、除了可以直接使用C提供的標準類型名(int、char、float等)和自己定義的數據類型(結構體、共用體、指針、枚舉類型)外,還可以用typedef聲明新的類型名來代替已有的類型名。typedef

int

INTEGERint

i,*p;INTEGERi,*p;typedef

float

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

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

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論