版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、1第第6章章 結(jié)構(gòu)體與共用體結(jié)構(gòu)體與共用體 6.1 結(jié)構(gòu)體概述結(jié)構(gòu)體概述6.1.1 結(jié)構(gòu)體的引入結(jié)構(gòu)體的引入 和一個學(xué)生有關(guān)的數(shù)據(jù):和一個學(xué)生有關(guān)的數(shù)據(jù): 姓名、姓名、 性別、性別、 學(xué)號、學(xué)號、 年齡、年齡、 家庭住址、學(xué)習(xí)成績家庭住址、學(xué)習(xí)成績 這些數(shù)據(jù)項之間這些數(shù)據(jù)項之間關(guān)系密切但數(shù)據(jù)類型不盡關(guān)系密切但數(shù)據(jù)類型不盡相同相同,若分別定義多個變量,就會割裂這些數(shù)據(jù),若分別定義多個變量,就會割裂這些數(shù)據(jù)項之間的內(nèi)在聯(lián)系。項之間的內(nèi)在聯(lián)系。 數(shù)組?數(shù)組?2 為了方便處理為了方便處理多個數(shù)據(jù)項多個數(shù)據(jù)項的數(shù)據(jù),常把這些的數(shù)據(jù),常把這些關(guān)系密切但類型不同關(guān)系密切但類型不同的數(shù)據(jù)項組織在一起,的數(shù)據(jù)項
2、組織在一起,即即“封裝封裝”起來,并為其取一個名字,在起來,并為其取一個名字,在C語言中,語言中,就稱其為就稱其為結(jié)構(gòu)體結(jié)構(gòu)體。 結(jié)構(gòu)體通常是由不同數(shù)據(jù)類型的數(shù)據(jù)項組成,一結(jié)構(gòu)體通常是由不同數(shù)據(jù)類型的數(shù)據(jù)項組成,一般也稱是由不同成員組成,因此可以說:般也稱是由不同成員組成,因此可以說:一個結(jié)構(gòu)體一個結(jié)構(gòu)體可包含若干成員,每一個成員可具有不同的名字及數(shù)可包含若干成員,每一個成員可具有不同的名字及數(shù)據(jù)類型。據(jù)類型。 結(jié)構(gòu)體的引入為結(jié)構(gòu)體的引入為處理復(fù)雜的數(shù)據(jù)結(jié)構(gòu)處理復(fù)雜的數(shù)據(jù)結(jié)構(gòu)提供提供了有力的手段,也了有力的手段,也為函數(shù)間傳遞一組不同數(shù)據(jù)為函數(shù)間傳遞一組不同數(shù)據(jù)類型的數(shù)據(jù)類型的數(shù)據(jù)提供了方便,
3、特別是對于數(shù)據(jù)結(jié)構(gòu)提供了方便,特別是對于數(shù)據(jù)結(jié)構(gòu)較為復(fù)雜的大型程序提供了方便。較為復(fù)雜的大型程序提供了方便。36.1 2 結(jié)構(gòu)體類型的定義結(jié)構(gòu)體類型的定義 結(jié)構(gòu)體類型結(jié)構(gòu)體類型和簡單類型不同,和簡單類型不同,簡單類型簡單類型是由系統(tǒng)預(yù)定義是由系統(tǒng)預(yù)定義的,如的,如int、float、char,直接可以使用直接可以使用。而。而結(jié)構(gòu)體類型結(jié)構(gòu)體類型是是根據(jù)需要根據(jù)需要由程序員自行定義由程序員自行定義,因此在使用之前,因此在使用之前必須先定義結(jié)必須先定義結(jié)構(gòu)體類型構(gòu)體類型。 結(jié)構(gòu)體類型定義:結(jié)構(gòu)體類型定義:struct 結(jié)構(gòu)體名結(jié)構(gòu)體名 類型標(biāo)識符類型標(biāo)識符 成員名;成員名; 類型標(biāo)識符類型標(biāo)識符
4、成員名;成員名; .;合法標(biāo)識符合法標(biāo)識符可?。豢墒。粺o名結(jié)構(gòu)體無名結(jié)構(gòu)體成員類型可以是成員類型可以是基本型或構(gòu)造型基本型或構(gòu)造型struct是是關(guān)鍵字關(guān)鍵字,不能省略不能省略注意:這里說的是定義結(jié)構(gòu)體類型而不是變量。注意:這里說的是定義結(jié)構(gòu)體類型而不是變量。4例例 struct student int num; char name20; char sex; int age; float score; char addr30; ; 結(jié)構(gòu)體類型定義描述結(jié)構(gòu)結(jié)構(gòu)體類型定義描述結(jié)構(gòu)的組織形式,的組織形式,不分配內(nèi)存不分配內(nèi)存5說明:說明: (1) 定義一個定義一個結(jié)構(gòu)體類型結(jié)構(gòu)體類型只是描述了此結(jié)構(gòu)
5、體的組織形只是描述了此結(jié)構(gòu)體的組織形 式,在編譯時式,在編譯時并不為其分配并不為其分配存儲空間,即僅描述此存儲空間,即僅描述此 數(shù)據(jù)結(jié)構(gòu)的形態(tài)或者說模型,故不能對定義的一個數(shù)據(jù)結(jié)構(gòu)的形態(tài)或者說模型,故不能對定義的一個 結(jié)構(gòu)體類型進行賦值、存取或運算。結(jié)構(gòu)體類型進行賦值、存取或運算。結(jié)構(gòu)體的成員可以是簡單變量、數(shù)組、指針、結(jié)構(gòu)體或結(jié)構(gòu)體的成員可以是簡單變量、數(shù)組、指針、結(jié)構(gòu)體或 共用體等。共用體等。 (3) 結(jié)構(gòu)體類型定義可以結(jié)構(gòu)體類型定義可以放在函數(shù)內(nèi)部放在函數(shù)內(nèi)部,也可以放在,也可以放在函數(shù)外函數(shù)外 部部。若放在內(nèi)部,則只在函數(shù)內(nèi)有效;若放在外部,。若放在內(nèi)部,則只在函數(shù)內(nèi)有效;若放在外部,
6、 則從定義點到源文件尾之間的所有函數(shù)都有效。則從定義點到源文件尾之間的所有函數(shù)都有效。(4) 結(jié)構(gòu)體成員的結(jié)構(gòu)體成員的名字名字可以同程序中的其它變量可以同程序中的其它變量同名同名,二者,二者 不會相混,系統(tǒng)會自動識別它。不會相混,系統(tǒng)會自動識別它。例如:剛才定義的結(jié)構(gòu)體中,例如:剛才定義的結(jié)構(gòu)體中, 年齡改用生日來描述。年齡改用生日來描述。 定義結(jié)構(gòu)體:定義結(jié)構(gòu)體: struct date_type int year; int month; int day; ;這樣,關(guān)于學(xué)生信息的結(jié)構(gòu)體這樣,關(guān)于學(xué)生信息的結(jié)構(gòu)體可定義為:可定義為: struct stud_type struct date_t
7、ype birthday; ;注意:結(jié)構(gòu)體注意:結(jié)構(gòu)體date_type一定要定義一定要定義 在結(jié)構(gòu)體在結(jié)構(gòu)體stud_type之前。之前。66.2 結(jié)構(gòu)體變量結(jié)構(gòu)體變量6.2.1 結(jié)構(gòu)體變量的定義與初始化結(jié)構(gòu)體變量的定義與初始化 1. 結(jié)構(gòu)體變量的定義結(jié)構(gòu)體變量的定義 先定義,再引用。先定義,再引用。 一個結(jié)構(gòu)體變量的定義可以有一個結(jié)構(gòu)體變量的定義可以有三種方式三種方式。7struct stud_type char name10; long num; char sex; int age; float score ; char address10;struct stud_type studen
8、t1, student2;(1) 先先定義類型定義類型再再定義變量定義變量直觀,靈活!直觀,靈活!8(2) 在定義類型的在定義類型的同時同時定義變量定義變量 struct stud_type student1, student2; (3) 直接直接定義結(jié)構(gòu)體變量定義結(jié)構(gòu)體變量 struct student1,student2;第一種的簡略形式。第一種的簡略形式。用于結(jié)構(gòu)體類型僅做一次性使用的場合。用于結(jié)構(gòu)體類型僅做一次性使用的場合。9說明:說明: (1) 在定義在定義結(jié)構(gòu)體類型結(jié)構(gòu)體類型時,系統(tǒng)時,系統(tǒng)并不分配內(nèi)存并不分配內(nèi)存 空間空間,僅當(dāng),僅當(dāng)定義結(jié)構(gòu)體變量時定義結(jié)構(gòu)體變量時,系統(tǒng)才為,系
9、統(tǒng)才為 被定義的每一變量被定義的每一變量分配相應(yīng)的存儲單元分配相應(yīng)的存儲單元。 如上面定義的結(jié)構(gòu)體變量如上面定義的結(jié)構(gòu)體變量student1、 student2在內(nèi)存中各占在內(nèi)存中各占33個字節(jié)個字節(jié) (10+4+1+4+4+10=33);); (2) 結(jié)構(gòu)體變量的定義一定要在結(jié)構(gòu)體類型定義結(jié)構(gòu)體變量的定義一定要在結(jié)構(gòu)體類型定義 之后之后或或同時同時進行。進行。(2) 結(jié)構(gòu)體變量結(jié)構(gòu)體變量的定義一定要在結(jié)構(gòu)體類型的定義一定要在結(jié)構(gòu)體類型 定義定義之后之后或或同時同時進行,對尚未定義的進行,對尚未定義的 結(jié)構(gòu)體類型,不能用它來定義結(jié)構(gòu)體變量。結(jié)構(gòu)體類型,不能用它來定義結(jié)構(gòu)體變量。例例 struc
10、t student int num; char name20; char sex; int age; float score; char addr30; ; namenumsexagescoreaddr4字節(jié)字節(jié)4字節(jié)字節(jié)20字節(jié)字節(jié)1字節(jié)字節(jié)4字節(jié)字節(jié)30字節(jié)字節(jié).例如:例如:對一個教師對一個教師teacher的結(jié)構(gòu)體類型未作定義,的結(jié)構(gòu)體類型未作定義, 則下面的變量定義則下面的變量定義 struct teacher teah1 是錯誤的;是錯誤的;102. 結(jié)構(gòu)體變量的初始化結(jié)構(gòu)體變量的初始化 所謂所謂結(jié)構(gòu)體變量初始化結(jié)構(gòu)體變量初始化,就是在定義結(jié),就是在定義結(jié)構(gòu)體變量的同時,對其成員變量
11、構(gòu)體變量的同時,對其成員變量賦初值賦初值。 在賦值時應(yīng)注意在賦值時應(yīng)注意按順序及類型按順序及類型依次為每依次為每個結(jié)構(gòu)體成員指定初始值。個結(jié)構(gòu)體成員指定初始值。結(jié)構(gòu)體初始化的一般結(jié)構(gòu)體初始化的一般格式格式為為: struct 結(jié)構(gòu)體類型名結(jié)構(gòu)體類型名 結(jié)構(gòu)體變量結(jié)構(gòu)體變量 = 初始化值初始化值;例例 struct student char name20; int num; char sex; int age; float score; char addr30; ; struct stud_type student1 = “wang”,196103,m,20,98,”xian”;11說明:說明:
12、 (1) 初始化數(shù)據(jù)之間用初始化數(shù)據(jù)之間用逗號逗號分隔。分隔。 (2) 初始化數(shù)據(jù)的個數(shù)一般與成員的初始化數(shù)據(jù)的個數(shù)一般與成員的個數(shù)相同個數(shù)相同, 若若小于小于成員數(shù),則剩余的成員將被自動成員數(shù),則剩余的成員將被自動初始初始 化為化為0(若成員是指針,則初始化為(若成員是指針,則初始化為NULL)。)。 (3) 初始化數(shù)據(jù)的初始化數(shù)據(jù)的類型類型要與相應(yīng)成員變量的類型要與相應(yīng)成員變量的類型 一致。一致。不一致將強制類型轉(zhuǎn)換不一致將強制類型轉(zhuǎn)換。 (4) 初始化時只能對初始化時只能對整個結(jié)構(gòu)體變量整個結(jié)構(gòu)體變量進行,進行,不能不能 對結(jié)構(gòu)體類型中的對結(jié)構(gòu)體類型中的某個成員某個成員進行初始化賦值。進
13、行初始化賦值。12 struct date_type int year; int mouth; int day; ;void main() struct stud_type student1=wang,196103,m,1978,10,12,98,Xian; struct stud_type student2=liu,196105,m,1980,9,22,88,Benjing; printf(%d,student1.birthday.day);struct stud_type char name10; long num; char sex; struct date_type birthday;
14、 float score; char address10; ;136.2.2 結(jié)構(gòu)體變量的引用結(jié)構(gòu)體變量的引用 1. 對結(jié)構(gòu)體變量成員的引用對結(jié)構(gòu)體變量成員的引用 在在C語言程序中,不準(zhǔn)許對結(jié)構(gòu)變量整體進行各語言程序中,不準(zhǔn)許對結(jié)構(gòu)變量整體進行各種運算、賦值或輸入輸出操作,而種運算、賦值或輸入輸出操作,而只能對其成員只能對其成員進進行此類操作。行此類操作。引用結(jié)構(gòu)體變量成員的一般形式:引用結(jié)構(gòu)體變量成員的一般形式: 結(jié)構(gòu)體變量名結(jié)構(gòu)體變量名.成員名成員名 其中其中“.”是結(jié)構(gòu)體成員運算符,其是結(jié)構(gòu)體成員運算符,其優(yōu)先級別最優(yōu)先級別最高高,結(jié)合性是,結(jié)合性是自左至右自左至右。由此對結(jié)構(gòu)體成員就完
15、全。由此對結(jié)構(gòu)體成員就完全可以像操作簡單變量一樣操作它??梢韵癫僮骱唵巫兞恳粯硬僮魉?。14如:對上例定義的結(jié)構(gòu)體變量如:對上例定義的結(jié)構(gòu)體變量 student1 或或 student2,可作如下的賦值操作:可作如下的賦值操作: 10= wang; strcpy(,”wang”) student1.num=196103; student1.sex=m; student1.birthday.year=1978; student1.birthday.mouth=10; student1.birthday.day=12; student1.score
16、=98;還可以如下操作:還可以如下操作: sum = student1.score + student2.score; scanf(“%s%d”,,&student1.num); printf(“%s%d”, ,student1.num);錯誤錯誤正確正確152. 對結(jié)構(gòu)體變量整體的引用對結(jié)構(gòu)體變量整體的引用 結(jié)構(gòu)體變量和簡單變量相比,除了上面所述結(jié)構(gòu)體變量和簡單變量相比,除了上面所述在參加各種運算、賦值或輸入輸出方式上有所不同在參加各種運算、賦值或輸入輸出方式上有所不同外外即是由結(jié)構(gòu)體變量成員完成,其它即是由結(jié)構(gòu)體變量成員完成,其它
17、同簡單變同簡單變量一樣量一樣,如:,如: (1) 可以相互賦值可以相互賦值,但注意相互賦值的兩個結(jié)構(gòu)體,但注意相互賦值的兩個結(jié)構(gòu)體 變量必須是同一個結(jié)構(gòu)體類型;變量必須是同一個結(jié)構(gòu)體類型; 如:如:student1=student2; (2) 可作為函數(shù)的形參、實參或函數(shù)返回值??勺鳛楹瘮?shù)的形參、實參或函數(shù)返回值。166.2.3 結(jié)構(gòu)體變量作為函數(shù)參數(shù)結(jié)構(gòu)體變量作為函數(shù)參數(shù)結(jié)構(gòu)體變量結(jié)構(gòu)體變量成員成員作函數(shù)參數(shù)作函數(shù)參數(shù) 結(jié)構(gòu)體變量中的所有成員都可作為函數(shù)參數(shù)。結(jié)構(gòu)體變量中的所有成員都可作為函數(shù)參數(shù)。 struct stud_type char name10; long num; char s
18、ex; student1; 將結(jié)構(gòu)體變量將結(jié)構(gòu)體變量student1的三個成員分別傳遞的三個成員分別傳遞給函數(shù)給函數(shù)func1(),func2(),func3(): func1(); func2(student1.num); func3(student1.sex);17 若需要將成員地址傳遞給函數(shù),則只若需要將成員地址傳遞給函數(shù),則只需在其前加取地址符需在其前加取地址符“&”。 如如: func1(); func2(&student1.num); func3(&student1.sex); 其中字符數(shù)組名其中字符數(shù)組名
19、name代表其成員地址,故代表其成員地址,故不需要寫不需要寫“&”。18 2. 結(jié)構(gòu)體變量結(jié)構(gòu)體變量整體整體作函數(shù)參數(shù)作函數(shù)參數(shù) 老板本的老板本的C系統(tǒng)不允許用結(jié)構(gòu)體變量作函數(shù)系統(tǒng)不允許用結(jié)構(gòu)體變量作函數(shù)參數(shù),只允許用指向結(jié)構(gòu)體變量的指針作函數(shù)參數(shù)參數(shù),只允許用指向結(jié)構(gòu)體變量的指針作函數(shù)參數(shù)(第(第7章),傳遞的是結(jié)構(gòu)體變量的首地址。章),傳遞的是結(jié)構(gòu)體變量的首地址。 而而ANSI C取消了這一限制,取消了這一限制,規(guī)定按值傳遞方式規(guī)定按值傳遞方式。在函數(shù)調(diào)用時,在函數(shù)調(diào)用時,系統(tǒng)為形參結(jié)構(gòu)體變量分配存儲空間系統(tǒng)為形參結(jié)構(gòu)體變量分配存儲空間,并從相應(yīng)的實參結(jié)構(gòu)體變量中取得各成員的值,若
20、并從相應(yīng)的實參結(jié)構(gòu)體變量中取得各成員的值,若對對形參中結(jié)構(gòu)體變量各成員值進行修改,并不能修改實形參中結(jié)構(gòu)體變量各成員值進行修改,并不能修改實參結(jié)構(gòu)體變量各成員的值參結(jié)構(gòu)體變量各成員的值。 注意,實參和形參結(jié)構(gòu)體變量注意,實參和形參結(jié)構(gòu)體變量類型類型應(yīng)當(dāng)完全一致。應(yīng)當(dāng)完全一致。196.3 結(jié)構(gòu)體數(shù)組結(jié)構(gòu)體數(shù)組6.3.1 結(jié)構(gòu)體數(shù)組的定義與初始化結(jié)構(gòu)體數(shù)組的定義與初始化 1. 結(jié)構(gòu)體數(shù)組的定義結(jié)構(gòu)體數(shù)組的定義 結(jié)構(gòu)體數(shù)組:數(shù)組的成員是結(jié)構(gòu)體類型數(shù)據(jù)元素。結(jié)構(gòu)體數(shù)組:數(shù)組的成員是結(jié)構(gòu)體類型數(shù)據(jù)元素。 在定義結(jié)構(gòu)體數(shù)組時,其定義方法與定義在定義結(jié)構(gòu)體數(shù)組時,其定義方法與定義結(jié)構(gòu)體變量方法類似,也有結(jié)構(gòu)
21、體變量方法類似,也有三種形式三種形式。 第一種定義方式:第一種定義方式: 20struct date_type int year; int mouth; int day;;struct stud_type char name10; long num; char sex; struct date_type birthday; float score; char address10;struct stud_type student3; 由此就定義了一個結(jié)構(gòu)體數(shù)由此就定義了一個結(jié)構(gòu)體數(shù)組,數(shù)組名是組,數(shù)組名是student1,它有它有3個個元素,每個元素都是元素,每個元素都是struct stud_
22、type類型類型 每個數(shù)組元素各占每個數(shù)組元素各占41個字節(jié)個字節(jié) (10+4+1+(4+4+4)+4+10=41)共占共占41*3個字節(jié)。個字節(jié)。 212. 結(jié)構(gòu)體數(shù)組的初始化結(jié)構(gòu)體數(shù)組的初始化 結(jié)構(gòu)體數(shù)組在定義的同時可以初始化結(jié)構(gòu)體數(shù)組在定義的同時可以初始化。 其其一般格式一般格式是在定義之后緊跟一個用花括號括起來是在定義之后緊跟一個用花括號括起來的一組初始數(shù)據(jù),為了增強可讀性,的一組初始數(shù)據(jù),為了增強可讀性,最好使每一個數(shù)組最好使每一個數(shù)組元素的初始數(shù)據(jù)也用花括弧括起來元素的初始數(shù)據(jù)也用花括弧括起來,以此來區(qū)分各個數(shù),以此來區(qū)分各個數(shù)組元素。組元素。 對剛定義的結(jié)構(gòu)體數(shù)組對剛定義的結(jié)構(gòu)體
23、數(shù)組student初始化如下:初始化如下: struct stud_type student3= wang,196103,m,1978,10,12,98, xian, “zhang”,196102, f,1977,1,10,87, “Beijing”, “l(fā)i”,196204,m,1977,9,21,82,”xian”;226.3.2 結(jié)構(gòu)體數(shù)組元素的引用結(jié)構(gòu)體數(shù)組元素的引用 和簡單變量數(shù)組元素的引用一樣:和簡單變量數(shù)組元素的引用一樣: 數(shù)組名數(shù)組名元素下標(biāo)元素下標(biāo) 結(jié)構(gòu)體數(shù)組元素的成員引用:結(jié)構(gòu)體數(shù)組元素的成員引用: 數(shù)組名數(shù)組名元素下標(biāo)元素下標(biāo).成員名成員名說明:說明: (1) 可以將一個
24、結(jié)構(gòu)體數(shù)組元素賦值給同一結(jié)構(gòu)體類型數(shù)可以將一個結(jié)構(gòu)體數(shù)組元素賦值給同一結(jié)構(gòu)體類型數(shù) 組中另一個元素,或賦給同一類型的變量。組中另一個元素,或賦給同一類型的變量。 定義:定義:struct stud_type student3, student1; 賦值:賦值: student1student0; student0=student1; studnet1=student1;23(2) 不能不能把結(jié)構(gòu)體數(shù)組元素作為一個把結(jié)構(gòu)體數(shù)組元素作為一個整體整體 直接進行直接進行輸入或輸出輸入或輸出。 如如 printf (“%d”,student0);或或scanf(%d,&student0); 只能
25、只能以以單個成員單個成員為對象進行為對象進行輸入輸出輸入輸出, 如:如: scanf(%s, ); scanf(%d,student0.num); printf (%s, );24例例 統(tǒng)計候選人選票統(tǒng)計候選人選票 struct person char name20; int count; leader3=“Li”, 0, “Zhang”, 0 , “Wang”, 0; void main() int i,j; char leader_name20; for(i=1;i=10;i+) scanf(%s,leader_name); for(j=
26、0;j3;j+) if(strcmp(leader_name,)=0) leaderj.count+; for(i=0;i3;i+) printf(%5s:%dn,,leaderi.count); namecountLiZhangWang000256.3.3 結(jié)構(gòu)體數(shù)組作函數(shù)參數(shù)結(jié)構(gòu)體數(shù)組作函數(shù)參數(shù) 結(jié)構(gòu)體數(shù)組作為函數(shù)參數(shù)傳遞在結(jié)構(gòu)體數(shù)組作為函數(shù)參數(shù)傳遞在C的的高版本中才支持高版本中才支持。 結(jié)構(gòu)體結(jié)構(gòu)體數(shù)組數(shù)組作為參數(shù)與結(jié)構(gòu)體作為參數(shù)與結(jié)構(gòu)體變量變量作為作為參數(shù)有本質(zhì)的參數(shù)有本質(zhì)的區(qū)別區(qū)別:結(jié)構(gòu)體:結(jié)構(gòu)體變量變量作函數(shù)參數(shù)作函數(shù)參數(shù)是是值傳遞值
27、傳遞,結(jié)構(gòu)體,結(jié)構(gòu)體數(shù)組數(shù)組作函數(shù)參數(shù)是作函數(shù)參數(shù)是地址傳地址傳遞遞。 當(dāng)然在定義形參與實參的結(jié)構(gòu)體當(dāng)然在定義形參與實參的結(jié)構(gòu)體類型類型時時還是必須一致還是必須一致,當(dāng)實參為結(jié)構(gòu)體數(shù)組時,其,當(dāng)實參為結(jié)構(gòu)體數(shù)組時,其形參須定義為同類型結(jié)構(gòu)的形參須定義為同類型結(jié)構(gòu)的結(jié)構(gòu)體數(shù)組或結(jié)結(jié)構(gòu)體數(shù)組或結(jié)構(gòu)體指針構(gòu)體指針 。266.4 共用體共用體 共用體是一種共用體是一種同一存儲區(qū)域由不同同一存儲區(qū)域由不同類型變量共享類型變量共享的數(shù)據(jù)類型。的數(shù)據(jù)類型。 它提供一種方法能它提供一種方法能在同一存儲區(qū)中操作在同一存儲區(qū)中操作不同類型的數(shù)據(jù)不同類型的數(shù)據(jù),也就是說,也就是說共共用體采用的是用體采用的是覆蓋存儲
28、技術(shù)覆蓋存儲技術(shù),準(zhǔn)許不同類型數(shù)據(jù)互相覆蓋。,準(zhǔn)許不同類型數(shù)據(jù)互相覆蓋。276.4.1 共用體類型定義共用體類型定義 共共用體類型的定義與結(jié)構(gòu)體類似用體類型的定義與結(jié)構(gòu)體類似。 一般定義格式如下:一般定義格式如下: union 共共用體名用體名 共共用體成員表用體成員表; ; 其中其中union是關(guān)鍵字,稱為是關(guān)鍵字,稱為共共用體定義標(biāo)識用體定義標(biāo)識符,符,共共用體名同樣由程序員來命名。大括號中的用體名同樣由程序員來命名。大括號中的共共用體成員表包含若干成員,每一個成員都具有用體成員表包含若干成員,每一個成員都具有如下的形式如下的形式: 數(shù)據(jù)類型標(biāo)識符數(shù)據(jù)類型標(biāo)識符 成員名;成員名;例如:例如
29、:union data int i; char ch; float f;;286.4.2 共用體變量定義與引用共用體變量定義與引用1. 共用體變量的定義共用體變量的定義 共用體變量的定義和結(jié)構(gòu)體變量定義一樣共用體變量的定義和結(jié)構(gòu)體變量定義一樣有有三種形式三種形式。 union 共共用體名用體名 共共用體成員表用體成員表; 變量列表變量列表; 如:如: union data int i; char ch; float f; a,b,c;29共用體和結(jié)構(gòu)體有著本質(zhì)的共用體和結(jié)構(gòu)體有著本質(zhì)的區(qū)別區(qū)別: 共用體共用體是幾個不同的變量是幾個不同的變量共占同一段內(nèi)存共占同一段內(nèi)存,且都是從同一地址開始存儲
30、,且都是從同一地址開始存儲,任意時刻只存儲任意時刻只存儲一種數(shù)據(jù)一種數(shù)據(jù)。分配空間的大小為需要存儲的數(shù)據(jù)。分配空間的大小為需要存儲的數(shù)據(jù)中占用字節(jié)數(shù)最多的那個數(shù)據(jù)類型的大小。中占用字節(jié)數(shù)最多的那個數(shù)據(jù)類型的大小。 結(jié)構(gòu)體結(jié)構(gòu)體是不同成員使用是不同成員使用不同的存儲空間不同的存儲空間,占用,占用的空間大小為各個成員需要占用的字節(jié)數(shù)的和。的空間大小為各個成員需要占用的字節(jié)數(shù)的和。30 例:例: struct data union data int i; int i; char ch; char ch; float f; float f; x; x;200020022003x.ix.chx.fx.c
31、hx.ix.f2000312. 共用體變量的引用共用體變量的引用 共用體變量名共用體變量名.成員名;成員名; 如上例所示:如上例所示:x.i; x.ch; x.f說明:說明: (1)共用體變量不能同時存放多個成員的值,而只能存)共用體變量不能同時存放多個成員的值,而只能存 放其中一個值,即只能存放當(dāng)前(最新)的一個成放其中一個值,即只能存放當(dāng)前(最新)的一個成 員的值;員的值; (2)就共用體變量整體而言,和結(jié)構(gòu)體變量一樣是)就共用體變量整體而言,和結(jié)構(gòu)體變量一樣是不能不能 進行整體的輸入、輸出進行整體的輸入、輸出,但可以在兩個同一類型的,但可以在兩個同一類型的 共用體變量之間賦值;共用體變量
32、之間賦值; (3)由于共用體變量不能同時存放多個成員的值,因此)由于共用體變量不能同時存放多個成員的值,因此 共用體變量共用體變量不能進行初始化不能進行初始化。32例例6.5 共用體變量的引用共用體變量的引用 void main() union int_char short i; char ch2; x; x.i=24897; printf(“i=%dn i=%o n”,x.i,x.i); printf(“ch0=%o,ch1=%o n ch0=%c,ch1=%c n”, x.ch0,x.ch1,x.ch0,x.ch1);336.5 枚舉類型枚舉類型 在實際應(yīng)用中,有些變量的取值范圍是有限在實
33、際應(yīng)用中,有些變量的取值范圍是有限的,僅可能只有幾個值,如一個星期的,僅可能只有幾個值,如一個星期7天,一年天,一年12個月,一副撲克有個月,一副撲克有4種花色,每一花色有種花色,每一花色有13張牌等。張牌等。 整型數(shù)來表示:整型數(shù)來表示:直觀性差直觀性差! 如在程序中使用如在程序中使用1,對于非編程者來說,它是代表,對于非編程者來說,它是代表星期一呢?還是一月份?很難區(qū)分。星期一呢?還是一月份?很難區(qū)分。 若在程序中使用若在程序中使用“Mon”,則不會有人認為是代表則不會有人認為是代表一月份。由此看出,一月份。由此看出,為提高程序的可讀性為提高程序的可讀性,引入,引入非數(shù)值非數(shù)值量量,即一些
34、有意義的符號是非常必要的。,即一些有意義的符號是非常必要的。 對于這種應(yīng)用,對于這種應(yīng)用,C語言引入語言引入枚舉類型枚舉類型,所謂,所謂“枚枚舉舉”,就是,就是將變量可取的值一一列舉出來將變量可取的值一一列舉出來。34枚舉類型也要枚舉類型也要先定義其類型先定義其類型,再定義其變量再定義其變量。枚舉類型定義的一般形式是:枚舉類型定義的一般形式是: enum 枚舉名枚舉名 枚舉值列表;枚舉值列表; ; 其中其中enum是關(guān)鍵字,稱為枚舉類型定義標(biāo)是關(guān)鍵字,稱為枚舉類型定義標(biāo)識符,枚舉名由程序員命名。識符,枚舉名由程序員命名。 枚舉值列表形式如下:枚舉值列表形式如下: 標(biāo)示符標(biāo)示符1,1,標(biāo)示符標(biāo)示
35、符2,2,標(biāo)示符標(biāo)示符n n 這里的標(biāo)識符也是由程序員自定義,都是一這里的標(biāo)識符也是由程序員自定義,都是一些描述性標(biāo)識符,些描述性標(biāo)識符,要求不能重名要求不能重名,這些標(biāo)識符分,這些標(biāo)識符分別代表不同枚舉元素,通常稱為別代表不同枚舉元素,通常稱為枚舉常量枚舉常量。35例如例如: enum weekday sun, mon, tue, wed, thu, fri, sat ; 由此定義了一個枚舉類型由此定義了一個枚舉類型enum weekday,它它有有7個枚舉元素(常量)。個枚舉元素(常量)。 在定義了類型之后,就可以用該類型來在定義了類型之后,就可以用該類型來定義變定義變量量: enum w
36、eekday workday;變量的定義也可以有變量的定義也可以有三種形式三種形式。36說明:說明: (1) 在在C語言中,每一個枚舉常量的值取決于在語言中,每一個枚舉常量的值取決于在 說明時排列的先后次序,說明時排列的先后次序,第一個枚舉常量的第一個枚舉常量的 序號為序號為0(規(guī)定序號從(規(guī)定序號從0編起),因此,此枚舉常編起),因此,此枚舉常 量值為量值為0,以后順序加以后順序加1,故,故不允許對枚舉常量進不允許對枚舉常量進 行賦值操作行賦值操作。 若想改變枚舉常量的值,在枚舉變量定義時可由若想改變枚舉常量的值,在枚舉變量定義時可由 程序員指定程序員指定: 如:如:enum fruit a
37、pple=7,pear,orange=3,lemon,peach t; 此時此時apple的值為的值為7,pear的值為的值為8,orange 的值為的值為3,lemon, peach的值分別為的值分別為4,5。37(2) 一個枚舉變量的值只能是這幾個枚舉常量一個枚舉變量的值只能是這幾個枚舉常量 之一,可以將枚舉常量賦給一個枚舉變量,之一,可以將枚舉常量賦給一個枚舉變量, 但不能將一個整數(shù)賦給它。如:但不能將一個整數(shù)賦給它。如: workday = sun; 正確正確 workday = 7; 錯誤錯誤 (3) 若想將整數(shù)值賦給枚舉變量須作強制類型轉(zhuǎn)換。若想將整數(shù)值賦給枚舉變量須作強制類型轉(zhuǎn)換
38、。 如:如: workday = (enum weekday)2; 相當(dāng)于相當(dāng)于 workday = tue; 注意:注意:轉(zhuǎn)換后的值亦應(yīng)在枚舉范圍內(nèi)轉(zhuǎn)換后的值亦應(yīng)在枚舉范圍內(nèi)。 workday = (enum weekday)10; 錯誤!錯誤!38enum weekday 0 1 2 3 4 5 6 sun, mon, tue, wed, thu, fri, sat ;enum weekday sun = 7, mon, tue, wed, thu, fri, sat ;enum weekday sun = 7, mon = 1, tue, wed, thu, fri, sat ;7 8 9 10 11 12 137 1 2 3 4 5 6396.6 用用typedef定義類型定義類型功能功能:用自定義名字為:用自定義名字為已有已有數(shù)據(jù)類型命名數(shù)據(jù)類型命名類型定義類型定義簡單形式:簡單形式: typedef type name;例例 typedef int INTEGER;類型定義語句關(guān)鍵字類型定義語句關(guān)鍵字已有數(shù)據(jù)類型名已有數(shù)據(jù)類型名用戶定義的類型名用戶定義的類型名例例 typedef float REAL;類型定義后類型定義后,與已有類型一樣使用與已有類型一樣使用例例 INTEGER a,b,c; REAL f1,f2; i
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度敬老院食堂餐飲承包協(xié)議
- 二零二五年度土地承包經(jīng)營權(quán)抵押擔(dān)保合同樣本3篇
- 二零二五年度情侶戀愛行為規(guī)范協(xié)議2篇
- 二零二五年度互聯(lián)網(wǎng)項目擔(dān)保人變更協(xié)議3篇
- 二零二五年度汽車抵押借款合同執(zhí)行標(biāo)準(zhǔn)2篇
- 資產(chǎn)評估課程設(shè)計電腦
- 體育場館布置方案范文(2篇)
- 二零二五年度水利工程設(shè)備安裝施工合同模板6篇
- 房建安全監(jiān)理細則模版(2篇)
- 透明傳輸課程設(shè)計
- GB/T 41837-2022溫泉服務(wù)溫泉水質(zhì)要求
- YS/T 79-2006硬質(zhì)合金焊接刀片
- 考研考博-英語-山東師范大學(xué)押題密卷附帶答案詳解篇
- 實用性閱讀與交流任務(wù)群設(shè)計思路與教學(xué)建議
- 中醫(yī)診療器具清洗消毒(醫(yī)院感染防控專家課堂培訓(xùn)課件)
- 通風(fēng)設(shè)施標(biāo)準(zhǔn)
- 寵物智能用品項目計劃書【模板范文】
- 藥廠生產(chǎn)車間現(xiàn)場管理-PPT課件
- 軸與孔標(biāo)準(zhǔn)公差表
- 防火門施工方案
- 人教PEP版2022-2023六年級英語上冊期末試卷及答案(含聽力材料)
評論
0/150
提交評論