結(jié)構(gòu)體、聯(lián)合體與枚舉類型_第1頁
結(jié)構(gòu)體、聯(lián)合體與枚舉類型_第2頁
結(jié)構(gòu)體、聯(lián)合體與枚舉類型_第3頁
結(jié)構(gòu)體、聯(lián)合體與枚舉類型_第4頁
結(jié)構(gòu)體、聯(lián)合體與枚舉類型_第5頁
已閱讀5頁,還剩56頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、第11章 結(jié)構(gòu)體、聯(lián)合體與枚舉類型,結(jié)構(gòu)體類型是C語言允許用戶定義的又一重要的構(gòu)造數(shù)據(jù)類型。,11.1 結(jié)構(gòu)體的概念 11.2 結(jié)構(gòu)體數(shù)組 11.3 結(jié)構(gòu)體指針 11.4 鏈 表 11.5 聯(lián)合體數(shù)據(jù)類型 11.6 枚舉數(shù)據(jù)類型 11.7 自定義類型,11.1 結(jié)構(gòu)體的概念 結(jié)構(gòu)體類型是一種構(gòu)造數(shù)據(jù)類型,是數(shù)目固定,類型不同的若干有序數(shù)據(jù)項的集合。每個數(shù)據(jù)項稱為一個成員。每一個成員可以是一個基本數(shù)據(jù)類型或者是一個構(gòu)造類型。結(jié)構(gòu)體數(shù)據(jù)類型具有很強的數(shù)據(jù)描述能力,但C語言中并不提供現(xiàn)成的結(jié)構(gòu)體類型。因此,用戶在使用一個結(jié)構(gòu)體類型之前,必須先定義它,也就是要在程序中構(gòu)造所需要的數(shù)據(jù)類型。,11.1.

2、1 結(jié)構(gòu)體類型的定義 結(jié)構(gòu)體類型定義的一般形式為: struct 結(jié)構(gòu)體類型名 類型標(biāo)識符 成員名1; 類型標(biāo)識符 成員名2; 類型標(biāo)識符 成員名n; ;,例如,定義一個“學(xué)生信息”的結(jié)構(gòu)體類型如下: struct student int num; char name10; char sex; int age; char addr50; int score; ;,11.1.2 結(jié)構(gòu)體變量的定義、引用、初始化 1結(jié)構(gòu)體變量的定義 (1)先定義結(jié)構(gòu)體類型,再定義結(jié)構(gòu)體類型變量。 這種定義的一般形式為: struct 結(jié)構(gòu)體類型名 結(jié)構(gòu)體變量名表; 如上面定義了“學(xué)生信息”的結(jié)構(gòu)體類型struct

3、student后,就可以用它來定義結(jié)構(gòu)體變量。,例如: struct student stul,stu2; 定義了stul和stu2為struct student類型的變量,編譯系統(tǒng)為變量 stul與stu2分配存儲空間時,其存儲格式與結(jié)構(gòu)體類型struct student所描述的保持一致,結(jié)構(gòu)體中的各個成員按要求順序存放。每一個struct student類型的變量占用的存儲單元為67個字節(jié)。,(2)在定義結(jié)構(gòu)體類型的同時定義結(jié)構(gòu)體變量。 這種定義的一般形式為: struct 結(jié)構(gòu)體類型名 類型標(biāo)識符 成員名1; 類型標(biāo)識符 成員名2; 類型標(biāo)識符 成員名n; 結(jié)構(gòu)體變量名表;,例如: st

4、ruct student int num; char name10; char sex; int age; char addr50; int score; stu1,stu2; 這種定義與前面的定義功能相同,都是既定義了結(jié)構(gòu)體類型struct student,又定義了兩個結(jié)構(gòu)體變量stu1與stu2。,(3)直接定義結(jié)構(gòu)體類型的變量。 其一般形式為: struct 類型標(biāo)識符 成員名1; 類型標(biāo)識符 成員名2; 類型標(biāo)識符 成員名n; 結(jié)構(gòu)體變量名表;,例如: struct int num; char name10; char sex; int age; char addr50; int sc

5、ore; stu1,stu2;,2結(jié)構(gòu)體變量的引用 結(jié)構(gòu)體成員引用的一般形式如下: 結(jié)構(gòu)變量名.成員名 其中“.”為結(jié)構(gòu)體成員運算符,所有C語言運算符中它的優(yōu)先級最高,因此可以把上述引用形式作為一個整體來看待。 例如, 、stu2.score分別表示結(jié)構(gòu)體變量stu1的成員name與結(jié)構(gòu)體變量stu2的成員score。,例11.1 定義有關(guān)職工工資信息的結(jié)構(gòu)體類型變量(包括編號、姓名、基本工資、附加工資、水電費、實發(fā)工資),為結(jié)構(gòu)體變量中的成員賦值并輸出其值。 struct person int num; /* 職工編號*/ char *name; /* 姓名 */ floa

6、t base; /* 基本工資*/ float addition; /* 附加工資*/ float cost; /* 水電費*/ float salary; /* 實發(fā)工資*/ ; main() struct person employeea,employeeb; employeea.num=2086; =Zhao xiwang;,printf(input base,addition,cost:n); scanf(f,f,f, ,程序運行結(jié)果為: input base,addition,cost: 805.85,376.57,123.52 Number=2086 N

7、ame= Zhao xiwang Base=805.85 Addition=376.57 Cost=123.52 Salary=1085.90,3結(jié)構(gòu)體變量的初始化 結(jié)構(gòu)體變量的初始化和對數(shù)組的初始化相類似。將各個成員的初值用一對花括弧括起來,括弧內(nèi)各數(shù)據(jù)項的數(shù)據(jù)類型、順序要和結(jié)構(gòu)體類型說明中的成員類型相匹配,數(shù)據(jù)項間用逗號分隔。如果初值的個數(shù)少于結(jié)構(gòu)中成員的個數(shù),則余下的成員將自動初始化為0或NULL。 例如: struct student int num; char name10; char sex; int age; char addr50; int score; ;,main( ) s

8、truct student stu=1422,Lin Hui,M,18,Shang Hai,85; printf(Number=dnName=snSex=cn,stu.num,,stu.sex); printf(Age=dnAddress=snScore=dn,stu.age,stu.addr,stu.score); ,程序運行結(jié)果為: Number=1422 Name=Lin Hui Sex=M Age=18 Address=Shang Hai Score=85,11.1.3 結(jié)構(gòu)體的嵌套 結(jié)構(gòu)體類型定義時,其成員的類型也可以是結(jié)構(gòu)體類型,即結(jié)構(gòu)體類型定義是可以嵌套的。結(jié)構(gòu)體

9、定義的嵌套可以是多重的。,例如,定義一個“職工信息”的結(jié)構(gòu)體類型。每個職工包含編號(num)、姓名(name)、性別(sex)、出生日期(birthday)、家庭住址(addr)等信息。其中出生日期包括年(year)、月(month)、日(day)3個數(shù)據(jù)項,家庭住址包括城市(city)、街道(street)、門牌號碼(streetnum)等信息。職工信息的邏輯結(jié)構(gòu)如圖11.3所示。,圖11.3 職工信息邏輯結(jié)構(gòu),顯然“職工信息”中的“出生日期”和“家庭住址”應(yīng)該用結(jié)構(gòu)體類型描述,首先定義結(jié)構(gòu)體類型“日期”struct date和“住址”struct address如下。 struct dat

10、e int year; /*年 */ int month; /*月 */ int day; /*日 */ ; struct address char city50; /*城市*/ char street50; /*街道*/ int streetnum; /*門牌號碼*/ ;,然后定義結(jié)構(gòu)體類型“職工”struct employee如下。 struct employee int num; char name10; char sex; struct date birthday; struct address addr; ;,在結(jié)構(gòu)體類型struct employee中,成員birthday是str

11、uct date結(jié)構(gòu)體類型,它又有自己的成員year、month、day,成員addr是 struct address結(jié)構(gòu)體類型,它又有自己的成員city、street、streetnum,這就是結(jié)構(gòu)體類型的嵌套定義。 對于嵌套的結(jié)構(gòu)體,引用時應(yīng)按照從左到右,從外到內(nèi)的方式,用“”一級一級地運算,直到找到最低一級的成員。,例如: struct employee emp; emp.num=1001; strcpy(,Liu Xiaomei); emp.sex=F; emp.birthday.year=1986; emp.birthday.month=5; emp.birthday

12、.day=18; strcpy(emp.addr.city,Bei Jing); strcpy(emp.addr.street,Changan street); emp.addr.streetnum=168;,定義了struct employee類型的變量emp,對其各個成員賦值。賦值后結(jié)構(gòu)體變量emp在內(nèi)存中的存儲形式如圖11.4所示。,圖11.4 結(jié)構(gòu)體變量emp,11.2 結(jié)構(gòu)體數(shù)組,11.2.1 結(jié)構(gòu)體數(shù)組的定義,結(jié)構(gòu)體數(shù)組的定義方法與其他整型數(shù)組、實型數(shù)組和字符型數(shù)組的定義方法類似。例如: struct student int num; char name10; char sex;

13、int age; char addr50; int score; ; struct student stu40;,與結(jié)構(gòu)體變量的定義類似,結(jié)構(gòu)體數(shù)組的定義也可以采用以下的方式: struct student int num; char name10; char sex; int age; char addr50; int score; stu40;,或 struct int num; char name10; char sex; int age; char addr50; int score; stu40;,11.2.2 結(jié)構(gòu)體數(shù)組的引用 例11.3 輸入全班的學(xué)生的信息(包括學(xué)號、姓名、性別

14、、年齡、成績和家庭住址),并按成績由高到低的次序排序,輸出排序后的全班學(xué)生信息登記表。 struct student int num; char name10; char sex; int age; char addr50; int score; ;,main() struct student stu40,temp; int i,j,k; for(i=0;i40;i+) printf(n學(xué)號:); scanf ( d, ,for(i=0;i39;i+) k=i; for(j=i+1;j40;j+) if(stuk.scorestuj.score) k=j; temp=stui; stui=st

15、uk; stuk=temp; printf(n學(xué)號t姓名t性別t年齡t家庭住址t成績n); for(i=0;i40;i+) printf(dtstct, stui.num,,stui.sex); printf(dtsttdn, stui.age,stui.addr,stui.score); ,11.2.3 結(jié)構(gòu)體數(shù)組的初始化,struct student int num; char name10; char sex; int age; char addr50; int score; ; struct student stu5= 6001,Zhao zhen ,F,18,Bei

16、jing,85, 6002, Lin ping ,F,19, Shanghai,70, 6003,He fang,F,18,Qingdao,92, 6004,Zhou ming,F,19,Jinan,87, 6005,Wang tao,M,18,Dalian,68;,11.3 結(jié)構(gòu)體指針,11.3.1 指向結(jié)構(gòu)體變量的指針 結(jié)構(gòu)體變量所占內(nèi)存單元的首地址稱為結(jié)構(gòu)體變量的指針。指向一個結(jié)構(gòu)體變量的指針變量,稱為結(jié)構(gòu)體指針變量。結(jié)構(gòu)體指針變量中的值是所指向的結(jié)構(gòu)體變量的指針。 結(jié)構(gòu)體指針變量定義的一般形式為: struct 結(jié)構(gòu)體類型名 *結(jié)構(gòu)體指針變量名,有了結(jié)構(gòu)體指針變量后,就能更方便地訪問結(jié)

17、構(gòu)體變量的各個成員。利用指針引用結(jié)構(gòu)體成員的一般形式為: (*結(jié)構(gòu)體指針變量).成員名 例如: (*pstu).num=6001; C語言中為了直觀而方便地通過指針來引用結(jié)構(gòu)體成員,專門設(shè)置了指向運算符“”來訪問結(jié)構(gòu)體成員,一般形式為: 結(jié)構(gòu)體指針變量-成員名 例如: pstu-num=6001;,例11.4 編一程序,利用結(jié)構(gòu)體指針處理結(jié)構(gòu)體中的成員。 struct student int num; char name10; char sex; int age; char addr50; int score; ; main() ,struct student stu= 6001,Zhao z

18、hen ,F,18,Beijing,85,*pstu; pstu= ,程序運行結(jié)果為: Number=6001, Name =Zhao zhen, Sex=F Age=18, Address =Beijing, Score =85 Number=6001, Name =Zhao zhen, Sex=F Age=18, Address =Beijing, Score =85 Number=6001, Name =Zhao zhen, Sex=F Age=18, Address =Beijing, Score =85,11.3.2 指向結(jié)構(gòu)體數(shù)組的指針 同前面討論的指向數(shù)組的指針一樣,結(jié)構(gòu)體指針也

19、可用于指向結(jié)構(gòu)體數(shù)組。 結(jié)構(gòu)體指針變量指向一個結(jié)構(gòu)體數(shù)組,這時結(jié)構(gòu)指針變量的值是整個結(jié)構(gòu)體數(shù)組的首地址。結(jié)構(gòu)體指針變量也可指向結(jié)構(gòu)體數(shù)組中的一個元素,這時結(jié)構(gòu)體指針變量的值是該結(jié)構(gòu)體數(shù)組元素的地址。,例11.5 利用結(jié)構(gòu)體指針變量輸出結(jié)構(gòu)體數(shù)組。,圖11.8 結(jié)構(gòu)數(shù)組的指針,11.3.3 結(jié)構(gòu)體指針作函數(shù)參數(shù) 結(jié)構(gòu)體變量作函數(shù)參數(shù)采取的是“單向值傳遞”方式,系統(tǒng)將實參結(jié)構(gòu)體的全部成員拷貝給被調(diào)用函數(shù)的形參。,例11.6 編寫程序,用結(jié)構(gòu)體指針變量作函數(shù)參數(shù),計算一組學(xué)生的平均成績和不及格人數(shù)。 struct student int num; char name10; int score; st

20、u5= 6001,Zhao zhen ,85,6002, Lin ping ,57,6003,He fang,62, 6004,Zhou ming,87, 6005,Wang tao,48; main() struct student *ps; void aver(struct student *ps); ps=stu; aver(ps); ,void aver(struct student *ps) int c=0,i; float ave,sum=0; for(i=0;iscore; if(ps-score60) c+=1; ave=sum/5; printf(average=.2fnco

21、unt=dn,ave,c); 程序運行結(jié)果為: average=67.80 count=2,11.4 鏈 表,11.5 聯(lián)合體數(shù)據(jù)類型,11.5.1 聯(lián)合體的定義,1聯(lián)合體類型的定義 定義一個聯(lián)合類型的一般形式為: union 聯(lián)合體類型名 類型標(biāo)識符 成員名1; 類型標(biāo)識符 成員名2; 類型標(biāo)識符 成員名n; ;,2聯(lián)合體變量的定義 (1)先定義聯(lián)合體類型,再定義聯(lián)合體變量。 (2)定義聯(lián)合體類型的同時定義聯(lián)合體變量。 (3)直接定義聯(lián)合體變量。,union udata類型的聯(lián)合體變量u,包含有3個成員i、c和f。注意,系統(tǒng)沒有分別給成員i,c,f,分配1個字節(jié),2個字節(jié),4個字節(jié)共7個字節(jié)

22、的存儲空間,而只分配一個成員項的空間,三個成員共同使用一塊內(nèi)存空間。但聯(lián)合體union udata中各個成員項的數(shù)據(jù)長度又互不相同,所以應(yīng)按其成員中數(shù)據(jù)長度最大的成員項f分配4個字節(jié)的內(nèi)存空間。聯(lián)合體變量u如果被賦予字符型值時就使用1個字節(jié)的存儲空間,被賦予整型值時就使用2個字節(jié)的存儲空間,被賦予實型值時,就使用4個字節(jié)的存儲空間。udata中的3個成員c,i,f,共同占用同一段內(nèi)存區(qū)的情況,如圖11.21所示。,圖11.21 聯(lián)合體變量共同占用內(nèi)存的情況,11.5.2 聯(lián)合體變量的引用 使用成員運算符“.”引用聯(lián)合體的成員,其一般格式為: 聯(lián)合變量名.成員名 例如u.i、u.c、u.f分別表

23、示聯(lián)合體變量u的成員i、c、f。聯(lián)合體變量的成員的使用方法與同類型的變量完全相同。但要注意的是,由于聯(lián)合體成員共同占用一塊內(nèi)存單元,一個聯(lián)合體變量,每次只能賦予一個成員值。因此某個時刻只能有一個成員變量起作用,其他的成員不起作用。并且在聯(lián)合體變量中起作用的成員是最后一次存放的成員,即在存入一個新的成員后,原來的成員就因被覆蓋而失去作用。,例11.15 分析下列程序的輸出結(jié)果。 main() union long a; int b; char c; m; m.a=65535; printf(ld d cn,m.a,m.b,m.c+66); 程序運行結(jié)果為: 65355 -1 A,程序中給聯(lián)合體m

24、的成員賦值為65535。假如聯(lián)合體變量m在內(nèi)存中分配的地址是2000H,那么m.a所占的內(nèi)存空間為2000H到2003H連續(xù)的四個字節(jié),其值為65535,在內(nèi)存中的存儲為(2000H)=(1111 1111)2 ,(2001H)=(1111 1111)2 ,(2002H)=(0000 0000)2 ,(2000H)=(0000 0000)2 ;m.b所占的內(nèi)存空間為2000H和2001H連續(xù)的兩個字節(jié),于是m.b的值為1;m.c所占的內(nèi)存空間為2000H,于是m.c的ascii值為255,程序中輸出m.c+66,得到的是ASCII值為65的字符,于是輸出A。,另外,可以通過指針來引用聯(lián)合體的成

25、員。其格式如下: (*指向聯(lián)合體變量指針名).成員名 或者 指向聯(lián)合體變量指針名-成員名 例如: union udata u,*pu; pu= 則指針pu指向聯(lián)合體變量u,通過指針pu可以訪問u中的各個成員。,例如: (*pu).i=23; 表示將23賦給pu指向的聯(lián)合體變量的成員i,或者 pu-i=23 以上兩種方法的效果是一樣的,但在使用指針訪問聯(lián)合體成員時,通常使用指向運算符“”訪問聯(lián)合體成員。,假設(shè)pu指向聯(lián)合體變量,則下面3個語句的效果是一樣的。 u.i=23; 等價于 (*pu).i=23; 等價于 pu-i=23 聯(lián)合體的特征決定了它的應(yīng)用遠不如結(jié)構(gòu)體應(yīng)用那樣廣泛。但是實際應(yīng)用中

26、,常常會出現(xiàn)一些量相互排斥的情況,這時用聯(lián)合體就非常方便。,11.6 枚舉數(shù)據(jù)類型,11.6.1 枚舉類型的定義 枚舉類型通過枚舉一系列有序的標(biāo)識符來定義。枚舉類型定義的一般格式為: enmu 枚舉名枚舉分量名1,枚舉分量名2,枚舉分量名n; 其中,enmu是定義枚舉類型的關(guān)鍵字。枚舉名遵循標(biāo)識符命名規(guī)則,用于標(biāo)識所定義的枚舉類型。枚舉分量也是一個合法的標(biāo)識符,由用戶根據(jù)需要自己確定,它們列出一個枚舉變量可以具有的值,又稱為枚舉常量。枚舉常量各自代表一個數(shù)值,因此它們之間有先后順序,可以進行比較。,例如: enum week sun ,mon,tue,wed,thu,fri,sut; 定義了一個枚舉類型enmu week,

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論