版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
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)體的引入 和一個(gè)學(xué)生有關(guān)的數(shù)據(jù):和一個(gè)學(xué)生有關(guān)的數(shù)據(jù): 姓名、姓名、 性別、性別、 學(xué)號(hào)、學(xué)號(hào)、 年齡、年齡、 家庭住址、學(xué)習(xí)成績(jī)家庭住址、學(xué)習(xí)成績(jī) 這些數(shù)據(jù)項(xiàng)之間這些數(shù)據(jù)項(xiàng)之間關(guān)系密切但數(shù)據(jù)類型不盡關(guān)系密切但數(shù)據(jù)類型不盡相同相同,若分別定義多個(gè)變量,就會(huì)割裂這些數(shù)據(jù),若分別定義多個(gè)變量,就會(huì)割裂這些數(shù)據(jù)項(xiàng)之間的內(nèi)在聯(lián)系。項(xiàng)之間的內(nèi)在聯(lián)系。 數(shù)組?數(shù)組?2 為了方便處理為了方便處理多個(gè)數(shù)據(jù)項(xiàng)多個(gè)數(shù)據(jù)項(xiàng)的數(shù)據(jù),常把這些的數(shù)據(jù),常把這些關(guān)系密切但類型不同關(guān)系密切但類型不同的數(shù)據(jù)項(xiàng)組織在一起,的數(shù)據(jù)項(xiàng)
2、組織在一起,即即“封裝封裝”起來(lái),并為其取一個(gè)名字,在起來(lái),并為其取一個(gè)名字,在C語(yǔ)言中,語(yǔ)言中,就稱其為就稱其為結(jié)構(gòu)體結(jié)構(gòu)體。 結(jié)構(gòu)體通常是由不同數(shù)據(jù)類型的數(shù)據(jù)項(xiàng)組成,一結(jié)構(gòu)體通常是由不同數(shù)據(jù)類型的數(shù)據(jù)項(xiàng)組成,一般也稱是由不同成員組成,因此可以說(shuō):般也稱是由不同成員組成,因此可以說(shuō):一個(gè)結(jié)構(gòu)體一個(gè)結(jié)構(gòu)體可包含若干成員,每一個(gè)成員可具有不同的名字及數(shù)可包含若干成員,每一個(gè)成員可具有不同的名字及數(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、特別是對(duì)于數(shù)據(jù)結(jié)構(gòu)提供了方便,特別是對(duì)于數(shù)據(jù)結(jié)構(gòu)較為復(fù)雜的大型程序提供了方便。較為復(fù)雜的大型程序提供了方便。36.1 2 結(jié)構(gòu)體類型的定義結(jié)構(gòu)體類型的定義 結(jié)構(gòu)體類型結(jié)構(gòu)體類型和簡(jiǎn)單類型不同,和簡(jiǎn)單類型不同,簡(jiǎn)單類型簡(jiǎn)單類型是由系統(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)識(shí)符類型標(biāo)識(shí)符 成員名;成員名; 類型標(biāo)識(shí)符類型標(biāo)識(shí)符
4、成員名;成員名; .;合法標(biāo)識(shí)符合法標(biāo)識(shí)符可省;可??;無(wú)名結(jié)構(gòu)體無(wú)名結(jié)構(gòu)體成員類型可以是成員類型可以是基本型或構(gòu)造型基本型或構(gòu)造型struct是是關(guān)鍵字關(guān)鍵字,不能省略不能省略注意:這里說(shuō)的是定義結(jié)構(gòu)體類型而不是變量。注意:這里說(shuō)的是定義結(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說(shuō)明:說(shuō)明: (1) 定義一個(gè)定義一個(gè)結(jié)構(gòu)體類型結(jié)構(gòu)體類型只是描述了此結(jié)構(gòu)
5、體的組織形只是描述了此結(jié)構(gòu)體的組織形 式,在編譯時(shí)式,在編譯時(shí)并不為其分配并不為其分配存儲(chǔ)空間,即僅描述此存儲(chǔ)空間,即僅描述此 數(shù)據(jù)結(jié)構(gòu)的形態(tài)或者說(shuō)模型,故不能對(duì)定義的一個(gè)數(shù)據(jù)結(jié)構(gòu)的形態(tài)或者說(shuō)模型,故不能對(duì)定義的一個(gè) 結(jié)構(gòu)體類型進(jìn)行賦值、存取或運(yùn)算。結(jié)構(gòu)體類型進(jìn)行賦值、存取或運(yùn)算。結(jié)構(gòu)體的成員可以是簡(jiǎn)單變量、數(shù)組、指針、結(jié)構(gòu)體或結(jié)構(gòu)體的成員可以是簡(jiǎn)單變量、數(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、 則從定義點(diǎn)到源文件尾之間的所有函數(shù)都有效。則從定義點(diǎn)到源文件尾之間的所有函數(shù)都有效。(4) 結(jié)構(gòu)體成員的結(jié)構(gòu)體成員的名字名字可以同程序中的其它變量可以同程序中的其它變量同名同名,二者,二者 不會(huì)相混,系統(tǒng)會(huì)自動(dòng)識(shí)別它。不會(huì)相混,系統(tǒng)會(huì)自動(dòng)識(shí)別它。例如:剛才定義的結(jié)構(gòu)體中,例如:剛才定義的結(jié)構(gòu)體中, 年齡改用生日來(lái)描述。年齡改用生日來(lái)描述。 定義結(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)體變量的定義 先定義,再引用。先定義,再引用。 一個(gè)結(jié)構(gòu)體變量的定義可以有一個(gè)結(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) 在定義類型的在定義類型的同時(shí)同時(shí)定義變量定義變量 struct stud_type student1, student2; (3) 直接直接定義結(jié)構(gòu)體變量定義結(jié)構(gòu)體變量 struct student1,student2;第一種的簡(jiǎn)略形式。第一種的簡(jiǎn)略形式。用于結(jié)構(gòu)體類型僅做一次性使用的場(chǎng)合。用于結(jié)構(gòu)體類型僅做一次性使用的場(chǎng)合。9說(shuō)明:說(shuō)明: (1) 在定義在定義結(jié)構(gòu)體類型結(jié)構(gòu)體類型時(shí),系統(tǒng)時(shí),系統(tǒng)并不分配內(nèi)存并不分配內(nèi)存 空間空間,僅當(dāng),僅當(dāng)定義結(jié)構(gòu)體變量時(shí)定義結(jié)構(gòu)體變量時(shí),系統(tǒng)才為,系
9、統(tǒng)才為 被定義的每一變量被定義的每一變量分配相應(yīng)的存儲(chǔ)單元分配相應(yīng)的存儲(chǔ)單元。 如上面定義的結(jié)構(gòu)體變量如上面定義的結(jié)構(gòu)體變量student1、 student2在內(nèi)存中各占在內(nèi)存中各占33個(gè)字節(jié)個(gè)字節(jié) (10+4+1+4+4+10=33);); (2) 結(jié)構(gòu)體變量的定義一定要在結(jié)構(gòu)體類型定義結(jié)構(gòu)體變量的定義一定要在結(jié)構(gòu)體類型定義 之后之后或或同時(shí)同時(shí)進(jìn)行。進(jìn)行。(2) 結(jié)構(gòu)體變量結(jié)構(gòu)體變量的定義一定要在結(jié)構(gòu)體類型的定義一定要在結(jié)構(gòu)體類型 定義定義之后之后或或同時(shí)同時(shí)進(jìn)行,對(duì)尚未定義的進(jìn)行,對(duì)尚未定義的 結(jié)構(gòu)體類型,不能用它來(lái)定義結(jié)構(gòu)體變量。結(jié)構(gòu)體類型,不能用它來(lái)定義結(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é).例如:例如:對(duì)一個(gè)教師對(duì)一個(gè)教師teacher的結(jié)構(gòu)體類型未作定義,的結(jié)構(gòu)體類型未作定義, 則下面的變量定義則下面的變量定義 struct teacher teah1 是錯(cuò)誤的;是錯(cuò)誤的;102. 結(jié)構(gòu)體變量的初始化結(jié)構(gòu)體變量的初始化 所謂所謂結(jié)構(gòu)體變量初始化結(jié)構(gòu)體變量初始化,就是在定義結(jié),就是在定義結(jié)構(gòu)體變量的同時(shí),對(duì)其成員變量
11、構(gòu)體變量的同時(shí),對(duì)其成員變量賦初值賦初值。 在賦值時(shí)應(yīng)注意在賦值時(shí)應(yīng)注意按順序及類型按順序及類型依次為每依次為每個(gè)結(jié)構(gòu)體成員指定初始值。個(gè)結(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說(shuō)明:說(shuō)明:
12、 (1) 初始化數(shù)據(jù)之間用初始化數(shù)據(jù)之間用逗號(hào)逗號(hào)分隔。分隔。 (2) 初始化數(shù)據(jù)的個(gè)數(shù)一般與成員的初始化數(shù)據(jù)的個(gè)數(shù)一般與成員的個(gè)數(shù)相同個(gè)數(shù)相同, 若若小于小于成員數(shù),則剩余的成員將被自動(dòng)成員數(shù),則剩余的成員將被自動(dòng)初始初始 化為化為0(若成員是指針,則初始化為(若成員是指針,則初始化為NULL)。)。 (3) 初始化數(shù)據(jù)的初始化數(shù)據(jù)的類型類型要與相應(yīng)成員變量的類型要與相應(yīng)成員變量的類型 一致。一致。不一致將強(qiáng)制類型轉(zhuǎn)換不一致將強(qiáng)制類型轉(zhuǎn)換。 (4) 初始化時(shí)只能對(duì)初始化時(shí)只能對(duì)整個(gè)結(jié)構(gòu)體變量整個(gè)結(jié)構(gòu)體變量進(jìn)行,進(jìn)行,不能不能 對(duì)結(jié)構(gòu)體類型中的對(duì)結(jié)構(gòu)體類型中的某個(gè)成員某個(gè)成員進(jìn)行初始化賦值。進(jìn)
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. 對(duì)結(jié)構(gòu)體變量成員的引用對(duì)結(jié)構(gòu)體變量成員的引用 在在C語(yǔ)言程序中,不準(zhǔn)許對(duì)結(jié)構(gòu)變量整體進(jìn)行各語(yǔ)言程序中,不準(zhǔn)許對(duì)結(jié)構(gòu)變量整體進(jìn)行各種運(yùn)算、賦值或輸入輸出操作,而種運(yùn)算、賦值或輸入輸出操作,而只能對(duì)其成員只能對(duì)其成員進(jìn)進(jìn)行此類操作。行此類操作。引用結(jié)構(gòu)體變量成員的一般形式:引用結(jié)構(gòu)體變量成員的一般形式: 結(jié)構(gòu)體變量名結(jié)構(gòu)體變量名.成員名成員名 其中其中“.”是結(jié)構(gòu)體成員運(yùn)算符,其是結(jié)構(gòu)體成員運(yùn)算符,其優(yōu)先級(jí)別最優(yōu)先級(jí)別最高高,結(jié)合性是,結(jié)合性是自左至右自左至右。由此對(duì)結(jié)構(gòu)體成員就完
15、全。由此對(duì)結(jié)構(gòu)體成員就完全可以像操作簡(jiǎn)單變量一樣操作它??梢韵癫僮骱?jiǎn)單變量一樣操作它。14如:對(duì)上例定義的結(jié)構(gòu)體變量如:對(duì)上例定義的結(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);錯(cuò)誤錯(cuò)誤正確正確152. 對(duì)結(jié)構(gòu)體變量整體的引用對(duì)結(jié)構(gòu)體變量整體的引用 結(jié)構(gòu)體變量和簡(jiǎn)單變量相比,除了上面所述結(jié)構(gòu)體變量和簡(jiǎn)單變量相比,除了上面所述在參加各種運(yùn)算、賦值或輸入輸出方式上有所不同在參加各種運(yùn)算、賦值或輸入輸出方式上有所不同外外即是由結(jié)構(gòu)體變量成員完成,其它即是由結(jié)構(gòu)體變量成員完成,其它
17、同簡(jiǎn)單變同簡(jiǎn)單變量一樣量一樣,如:,如: (1) 可以相互賦值可以相互賦值,但注意相互賦值的兩個(gè)結(jié)構(gòu)體,但注意相互賦值的兩個(gè)結(jié)構(gòu)體 變量必須是同一個(gè)結(jié)構(gòu)體類型;變量必須是同一個(gè)結(jié)構(gòu)體類型; 如:如:student1=student2; (2) 可作為函數(shù)的形參、實(shí)參或函數(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的三個(gè)成員分別傳遞的三個(gè)成員分別傳遞給函數(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í),在函數(shù)調(diào)用時(shí),系統(tǒng)為形參結(jié)構(gòu)體變量分配存儲(chǔ)空間系統(tǒng)為形參結(jié)構(gòu)體變量分配存儲(chǔ)空間,并從相應(yīng)的實(shí)參結(jié)構(gòu)體變量中取得各成員的值,若
20、并從相應(yīng)的實(shí)參結(jié)構(gòu)體變量中取得各成員的值,若對(duì)對(duì)形參中結(jié)構(gòu)體變量各成員值進(jìn)行修改,并不能修改實(shí)形參中結(jié)構(gòu)體變量各成員值進(jìn)行修改,并不能修改實(shí)參結(jié)構(gòu)體變量各成員的值參結(jié)構(gòu)體變量各成員的值。 注意,實(shí)參和形參結(jié)構(gòu)體變量注意,實(shí)參和形參結(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ù)組時(shí),其定義方法與定義在定義結(jié)構(gòu)體數(shù)組時(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; 由此就定義了一個(gè)結(jié)構(gòu)體數(shù)由此就定義了一個(gè)結(jié)構(gòu)體數(shù)組,數(shù)組名是組,數(shù)組名是student1,它有它有3個(gè)個(gè)元素,每個(gè)元素都是元素,每個(gè)元素都是struct stud_
22、type類型類型 每個(gè)數(shù)組元素各占每個(gè)數(shù)組元素各占41個(gè)字節(jié)個(gè)字節(jié) (10+4+1+(4+4+4)+4+10=41)共占共占41*3個(gè)字節(jié)。個(gè)字節(jié)。 212. 結(jié)構(gòu)體數(shù)組的初始化結(jié)構(gòu)體數(shù)組的初始化 結(jié)構(gòu)體數(shù)組在定義的同時(shí)可以初始化結(jié)構(gòu)體數(shù)組在定義的同時(shí)可以初始化。 其其一般格式一般格式是在定義之后緊跟一個(gè)用花括號(hào)括起來(lái)是在定義之后緊跟一個(gè)用花括號(hào)括起來(lái)的一組初始數(shù)據(jù),為了增強(qiáng)可讀性,的一組初始數(shù)據(jù),為了增強(qiáng)可讀性,最好使每一個(gè)數(shù)組最好使每一個(gè)數(shù)組元素的初始數(shù)據(jù)也用花括弧括起來(lái)元素的初始數(shù)據(jù)也用花括弧括起來(lái),以此來(lái)區(qū)分各個(gè)數(shù),以此來(lái)區(qū)分各個(gè)數(shù)組元素。組元素。 對(duì)剛定義的結(jié)構(gòu)體數(shù)組對(duì)剛定義的結(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ù)組元素的引用 和簡(jiǎn)單變量數(shù)組元素的引用一樣:和簡(jiǎn)單變量數(shù)組元素的引用一樣: 數(shù)組名數(shù)組名元素下標(biāo)元素下標(biāo) 結(jié)構(gòu)體數(shù)組元素的成員引用:結(jié)構(gòu)體數(shù)組元素的成員引用: 數(shù)組名數(shù)組名元素下標(biāo)元素下標(biāo).成員名成員名說(shuō)明:說(shuō)明: (1) 可以將一個(gè)
24、結(jié)構(gòu)體數(shù)組元素賦值給同一結(jié)構(gòu)體類型數(shù)可以將一個(gè)結(jié)構(gòu)體數(shù)組元素賦值給同一結(jié)構(gòu)體類型數(shù) 組中另一個(gè)元素,或賦給同一類型的變量。組中另一個(gè)元素,或賦給同一類型的變量。 定義:定義:struct stud_type student3, student1; 賦值:賦值: student1student0; student0=student1; studnet1=student1;23(2) 不能不能把結(jié)構(gòu)體數(shù)組元素作為一個(gè)把結(jié)構(gòu)體數(shù)組元素作為一個(gè)整體整體 直接進(jìn)行直接進(jìn)行輸入或輸出輸入或輸出。 如如 printf (“%d”,student0);或或scanf(%d,&student0); 只能
25、只能以以單個(gè)成員單個(gè)成員為對(duì)象進(jìn)行為對(duì)象進(jìn)行輸入輸出輸入輸出, 如:如: scanf(%s, ); scanf(%d,student0.num); printf (%s, );24例例 統(tǒng)計(jì)候選人選票統(tǒng)計(jì)候選人選票 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)然在定義形參與實(shí)參的結(jié)構(gòu)體當(dāng)然在定義形參與實(shí)參的結(jié)構(gòu)體類型類型時(shí)時(shí)還是必須一致還是必須一致,當(dāng)實(shí)參為結(jié)構(gòu)體數(shù)組時(shí),其,當(dāng)實(shí)參為結(jié)構(gòu)體數(shù)組時(shí),其形參須定義為同類型結(jié)構(gòu)的形參須定義為同類型結(jié)構(gòu)的結(jié)構(gòu)體數(shù)組或結(jié)結(jié)構(gòu)體數(shù)組或結(jié)構(gòu)體指針構(gòu)體指針 。266.4 共用體共用體 共用體是一種共用體是一種同一存儲(chǔ)區(qū)域由不同同一存儲(chǔ)區(qū)域由不同類型變量共享類型變量共享的數(shù)據(jù)類型。的數(shù)據(jù)類型。 它提供一種方法能它提供一種方法能在同一存儲(chǔ)區(qū)中操作在同一存儲(chǔ)區(qū)中操作不同類型的數(shù)據(jù)不同類型的數(shù)據(jù),也就是說(shuō),也就是說(shuō)共共用體采用的是用體采用的是覆蓋存儲(chǔ)
28、技術(shù)覆蓋存儲(chǔ)技術(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)識(shí)用體定義標(biāo)識(shí)符,符,共共用體名同樣由程序員來(lái)命名。大括號(hào)中的用體名同樣由程序員來(lái)命名。大括號(hào)中的共共用體成員表包含若干成員,每一個(gè)成員都具有用體成員表包含若干成員,每一個(gè)成員都具有如下的形式如下的形式: 數(shù)據(jù)類型標(biāo)識(shí)符數(shù)據(jù)類型標(biāo)識(shí)符 成員名;成員名;例如:例如
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ū)別: 共用體共用體是幾個(gè)不同的變量是幾個(gè)不同的變量共占同一段內(nèi)存共占同一段內(nèi)存,且都是從同一地址開(kāi)始存儲(chǔ)
30、,且都是從同一地址開(kāi)始存儲(chǔ),任意時(shí)刻只存儲(chǔ)任意時(shí)刻只存儲(chǔ)一種數(shù)據(jù)一種數(shù)據(jù)。分配空間的大小為需要存儲(chǔ)的數(shù)據(jù)。分配空間的大小為需要存儲(chǔ)的數(shù)據(jù)中占用字節(jié)數(shù)最多的那個(gè)數(shù)據(jù)類型的大小。中占用字節(jié)數(shù)最多的那個(gè)數(shù)據(jù)類型的大小。 結(jié)構(gòu)體結(jié)構(gòu)體是不同成員使用是不同成員使用不同的存儲(chǔ)空間不同的存儲(chǔ)空間,占用,占用的空間大小為各個(gè)成員需要占用的字節(jié)數(shù)的和。的空間大小為各個(gè)成員需要占用的字節(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說(shuō)明:說(shuō)明: (1)共用體變量不能同時(shí)存放多個(gè)成員的值,而只能存)共用體變量不能同時(shí)存放多個(gè)成員的值,而只能存 放其中一個(gè)值,即只能存放當(dāng)前(最新)的一個(gè)成放其中一個(gè)值,即只能存放當(dāng)前(最新)的一個(gè)成 員的值;員的值; (2)就共用體變量整體而言,和結(jié)構(gòu)體變量一樣是)就共用體變量整體而言,和結(jié)構(gòu)體變量一樣是不能不能 進(jìn)行整體的輸入、輸出進(jìn)行整體的輸入、輸出,但可以在兩個(gè)同一類型的,但可以在兩個(gè)同一類型的 共用體變量之間賦值;共用體變量
32、之間賦值; (3)由于共用體變量不能同時(shí)存放多個(gè)成員的值,因此)由于共用體變量不能同時(shí)存放多個(gè)成員的值,因此 共用體變量共用體變量不能進(jìn)行初始化不能進(jìn)行初始化。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 枚舉類型枚舉類型 在實(shí)際應(yīng)用中,有些變量的取值范圍是有限在實(shí)
33、際應(yīng)用中,有些變量的取值范圍是有限的,僅可能只有幾個(gè)值,如一個(gè)星期的,僅可能只有幾個(gè)值,如一個(gè)星期7天,一年天,一年12個(gè)月,一副撲克有個(gè)月,一副撲克有4種花色,每一花色有種花色,每一花色有13張牌等。張牌等。 整型數(shù)來(lái)表示:整型數(shù)來(lái)表示:直觀性差直觀性差! 如在程序中使用如在程序中使用1,對(duì)于非編程者來(lái)說(shuō),它是代表,對(duì)于非編程者來(lái)說(shuō),它是代表星期一呢?還是一月份?很難區(qū)分。星期一呢?還是一月份?很難區(qū)分。 若在程序中使用若在程序中使用“Mon”,則不會(huì)有人認(rèn)為是代表則不會(huì)有人認(rèn)為是代表一月份。由此看出,一月份。由此看出,為提高程序的可讀性為提高程序的可讀性,引入,引入非數(shù)值非數(shù)值量量,即一些
34、有意義的符號(hào)是非常必要的。,即一些有意義的符號(hào)是非常必要的。 對(duì)于這種應(yīng)用,對(duì)于這種應(yīng)用,C語(yǔ)言引入語(yǔ)言引入枚舉類型枚舉類型,所謂,所謂“枚枚舉舉”,就是,就是將變量可取的值一一列舉出來(lái)將變量可取的值一一列舉出來(lái)。34枚舉類型也要枚舉類型也要先定義其類型先定義其類型,再定義其變量再定義其變量。枚舉類型定義的一般形式是:枚舉類型定義的一般形式是: enum 枚舉名枚舉名 枚舉值列表;枚舉值列表; ; 其中其中enum是關(guān)鍵字,稱為枚舉類型定義標(biāo)是關(guān)鍵字,稱為枚舉類型定義標(biāo)識(shí)符,枚舉名由程序員命名。識(shí)符,枚舉名由程序員命名。 枚舉值列表形式如下:枚舉值列表形式如下: 標(biāo)示符標(biāo)示符1,1,標(biāo)示符標(biāo)示
35、符2,2,標(biāo)示符標(biāo)示符n n 這里的標(biāo)識(shí)符也是由程序員自定義,都是一這里的標(biāo)識(shí)符也是由程序員自定義,都是一些描述性標(biāo)識(shí)符,些描述性標(biāo)識(shí)符,要求不能重名要求不能重名,這些標(biāo)識(shí)符分,這些標(biāo)識(shí)符分別代表不同枚舉元素,通常稱為別代表不同枚舉元素,通常稱為枚舉常量枚舉常量。35例如例如: enum weekday sun, mon, tue, wed, thu, fri, sat ; 由此定義了一個(gè)枚舉類型由此定義了一個(gè)枚舉類型enum weekday,它它有有7個(gè)枚舉元素(常量)。個(gè)枚舉元素(常量)。 在定義了類型之后,就可以用該類型來(lái)在定義了類型之后,就可以用該類型來(lái)定義變定義變量量: enum w
36、eekday workday;變量的定義也可以有變量的定義也可以有三種形式三種形式。36說(shuō)明:說(shuō)明: (1) 在在C語(yǔ)言中,每一個(gè)枚舉常量的值取決于在語(yǔ)言中,每一個(gè)枚舉常量的值取決于在 說(shuō)明時(shí)排列的先后次序,說(shuō)明時(shí)排列的先后次序,第一個(gè)枚舉常量的第一個(gè)枚舉常量的 序號(hào)為序號(hào)為0(規(guī)定序號(hào)從(規(guī)定序號(hào)從0編起),因此,此枚舉常編起),因此,此枚舉常 量值為量值為0,以后順序加以后順序加1,故,故不允許對(duì)枚舉常量進(jìn)不允許對(duì)枚舉常量進(jìn) 行賦值操作行賦值操作。 若想改變枚舉常量的值,在枚舉變量定義時(shí)可由若想改變枚舉常量的值,在枚舉變量定義時(shí)可由 程序員指定程序員指定: 如:如:enum fruit a
37、pple=7,pear,orange=3,lemon,peach t; 此時(shí)此時(shí)apple的值為的值為7,pear的值為的值為8,orange 的值為的值為3,lemon, peach的值分別為的值分別為4,5。37(2) 一個(gè)枚舉變量的值只能是這幾個(gè)枚舉常量一個(gè)枚舉變量的值只能是這幾個(gè)枚舉常量 之一,可以將枚舉常量賦給一個(gè)枚舉變量,之一,可以將枚舉常量賦給一個(gè)枚舉變量, 但不能將一個(gè)整數(shù)賦給它。如:但不能將一個(gè)整數(shù)賦給它。如: workday = sun; 正確正確 workday = 7; 錯(cuò)誤錯(cuò)誤 (3) 若想將整數(shù)值賦給枚舉變量須作強(qiáng)制類型轉(zhuǎn)換。若想將整數(shù)值賦給枚舉變量須作強(qiáng)制類型轉(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; 錯(cuò)誤!錯(cuò)誤!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ù)類型命名類型定義類型定義簡(jiǎn)單形式:簡(jiǎn)單形式: typedef type name;例例 typedef int INTEGER;類型定義語(yǔ)句關(guān)鍵字類型定義語(yǔ)句關(guān)鍵字已有數(shù)據(jù)類型名已有數(shù)據(jù)類型名用戶定義的類型名用戶定義的類型名例例 typedef float REAL;類型定義后類型定義后,與已有類型一樣使用與已有類型一樣使用例例 INTEGER a,b,c; REAL f1,f2; i
溫馨提示
- 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ù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 油氣開(kāi)采技術(shù)智能化發(fā)展-洞察分析
- 采購(gòu)合同和采購(gòu)訂單的物聯(lián)網(wǎng)技術(shù)3篇
- 采購(gòu)合同培訓(xùn)班級(jí)代表發(fā)言3篇
- 采購(gòu)合同中的工程質(zhì)量責(zé)任規(guī)定3篇
- 采購(gòu)合同中的工程進(jìn)度管理3篇
- 校本培訓(xùn)經(jīng)驗(yàn)交流
- 采購(gòu)合同的分類解析3篇
- 無(wú)線電頻率資源管理-洞察分析
- 一年級(jí)數(shù)學(xué)計(jì)算題專項(xiàng)練習(xí)匯編
- 二年級(jí)數(shù)學(xué)計(jì)算題專項(xiàng)練習(xí)集錦
- 有限空間作業(yè)安全管理協(xié)議
- 勞務(wù)派遣方案
- 介紹河南的英文課件演講
- 道路綠化養(yǎng)護(hù)投標(biāo)方案(技術(shù)方案)
- 跨省戶口網(wǎng)上遷移告知單
- 屋面工程質(zhì)量控制
- 高中英語(yǔ)校本教材《英語(yǔ)美文閱讀與欣賞》
- 我的太爺老師(2020河南中考記敘文閱讀試題含答案)
- 【高中語(yǔ)文】《鄉(xiāng)土中國(guó)-家族》課件19張+統(tǒng)編版必修上冊(cè)
- 二年級(jí)上冊(cè)英語(yǔ)說(shuō)課稿-Module 4 Unit 2 He doesn't like these trousers|外研社(一起)
- 重型燃?xì)廨啓C(jī)
評(píng)論
0/150
提交評(píng)論