




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、10.1 結構體數據類型概述結構體數據類型概述10.2 結構體變量的使用結構體變量的使用10.3 結構體結構體數組數組10.4 共用體數據類型共用體數據類型10.5 枚舉數據枚舉數據類型類型10.6 用用typedef定義數據類型定義數據類型 有時需要將不同類型的數據組合成一個有有時需要將不同類型的數據組合成一個有機的整體。例如,一個學生的學號、姓名、機的整體。例如,一個學生的學號、姓名、性別、年齡、成績、家庭地址等項,這些性別、年齡、成績、家庭地址等項,這些項都與某一學生有聯系,對每個學生來說,項都與某一學生有聯系,對每個學生來說,除了其各項的值不同外,表示形式是一樣除了其各項的值不同外,表
2、示形式是一樣的。的。 用戶自己建立由不同類型數據組成的組合用戶自己建立由不同類型數據組成的組合型的數據結構,它稱為型的數據結構,它稱為結構體結構體。struct student intnum;charname20;charsex;intage;floatscore;charaddr30;/注意分號不能少u由程序設計者指定了由程序設計者指定了一個結構體類型一個結構體類型struct studentu它包括它包括num,name,sex,age,score,addr等不同類等不同類型的成員型的成員定義一個結構體類型的一般形式為:定義一個結構體類型的一般形式為:struct 結構體名結構體名 類型標
3、識符類型標識符 成員成員1名字名字;類型標識符類型標識符 成員成員2名字名字; 類型標識符類型標識符 成員成員3名字名字;其中,其中,“”和和“”之間的內容被稱為成員表列。之間的內容被稱為成員表列。10.2.1 結構體變量的定義結構體變量的定義10.2.2 結構體變量的引用結構體變量的引用10.2.3 結構體變量的初始化結構體變量的初始化前面只是建立了一個結構體類型,它相當于一個前面只是建立了一個結構體類型,它相當于一個模型,并沒有定義變量,其中并無具體數據,系模型,并沒有定義變量,其中并無具體數據,系統對之也不分配存儲單元。統對之也不分配存儲單元。相當于設計好了圖紙,但未建成具體的房屋。為相
4、當于設計好了圖紙,但未建成具體的房屋。為了能在程序中使用結構體類型的數據,應當定義了能在程序中使用結構體類型的數據,應當定義結構體類型的變量,并在其中存放具體的數據。結構體類型的變量,并在其中存放具體的數據。要定義一個結構體類型的變量,可以采取以下三要定義一個結構體類型的變量,可以采取以下三種方法。種方法。1. 先先定義定義結構體類型,再定義該類型變量結構體類型,再定義該類型變量聲明結構體類型聲明結構體類型struct student,可以可以用它來定義變量用它來定義變量 struct student student1,student2;結構體類型名結構體類型名結構體變量名結構體變量名 2.在
5、在定義定義類型的同時定義變量類型的同時定義變量struct student int num; char name20; char sex; int age; float score; char addr30; student1,student2;3. 不指定類型名而直接定義結構體類型變量不指定類型名而直接定義結構體類型變量其一般形式為其一般形式為: struct 成員表列成員表列 變量名表列變量名表列; 指定了一個無名的結構體類型指定了一個無名的結構體類型 。說明:說明:(1) 結構體類型與結構體變量是不同的概念結構體類型與結構體變量是不同的概念,不要混同。只能對變量賦值、存取或運,不要混同。
6、只能對變量賦值、存取或運算,而不能對一個類型賦值、存取或運算算,而不能對一個類型賦值、存取或運算。在編譯時,對類型是不分配空間的,只。在編譯時,對類型是不分配空間的,只對變量分配空間。對變量分配空間。(2) 對結構體變量中的成員(即對結構體變量中的成員(即“域域”),),可以單獨使用,它的作用與地位相當于普可以單獨使用,它的作用與地位相當于普通變量。通變量。(3) 成員可以屬于另一個結構體類型。成員可以屬于另一個結構體類型。 struct date int month; int day; int year; ;struct Stu int num;char name20; char sex;i
7、nt age; struct date birthday; char addr30; ;(3) 成員可以屬于另一個結構體類型。成員可以屬于另一個結構體類型。 (4)成員名可以與程序中的變量名相同,二成員名可以與程序中的變量名相同,二者不代表同一對象。例如,程序中可以定者不代表同一對象。例如,程序中可以定義一個變量義一個變量num,它與,它與struct student中的中的num是兩回事,互不干擾。是兩回事,互不干擾。在定義了結構體變量以后,可以引用這個在定義了結構體變量以后,可以引用這個變量。但應遵守以下規則:變量。但應遵守以下規則: (1)不能將一個結構體變量作為一個整體)不能將一個結構
8、體變量作為一個整體進行輸入和輸出。進行輸入和輸出。 (2)結構體變量可以通過賦值運算符將其)結構體變量可以通過賦值運算符將其值賦給另一個相同類型的結構體變量,實值賦給另一個相同類型的結構體變量,實現結構體變量中所有成員內容的復制。現結構體變量中所有成員內容的復制。(3)如果成員本身又屬一個結構體類型,則要用)如果成員本身又屬一個結構體類型,則要用若干級成員運算符,一級一級地找到最低一級的若干級成員運算符,一級一級地找到最低一級的成員。只能對最低級的成員進行賦值或存取以及成員。只能對最低級的成員進行賦值或存取以及運算。運算。 (4)對成員變量可以像普通變量一樣進行各種運)對成員變量可以像普通變量
9、一樣進行各種運算(根據其類型決定可以進行的運算)。算(根據其類型決定可以進行的運算)。(5)可以引用成員的地址,也可以引用結構體變)可以引用成員的地址,也可以引用結構體變量的地址。量的地址。 結構體變量也可以在變量定義時進行初始結構體變量也可以在變量定義時進行初始化,即在定義變量的同時給變量的成員賦化,即在定義變量的同時給變量的成員賦值。值。【例例10.1】定義學生結構體類型定義學生結構體類型student和兩和兩個個student類型的變量類型的變量student1和和student2,對其初始化,并在主函數,對其初始化,并在主函數main中輸出中輸出student1和和student2。解
10、題思路:該題主要考察對組合結構體類型的定解題思路:該題主要考察對組合結構體類型的定義和使用,包括結構體變量的初始化、賦值和輸義和使用,包括結構體變量的初始化、賦值和輸出,其中關鍵是如何訪問結構體變量的成員。出,其中關鍵是如何訪問結構體變量的成員。10.3.1 結構體數組的定義結構體數組的定義10.3.2 結構體數組的初始化結構體數組的初始化10.3.3 結構體數組的引用結構體數組的引用 和定義結構體變量的方法相同,只需說明其為數組,可采用下列和定義結構體變量的方法相同,只需說明其為數組,可采用下列3種種方法中的一種。方法中的一種。(1)struct student intnum;charnam
11、e20;charsex;intage;floatscore;charaddr30;student stu3;(2)struct student intnum;charname20;charsex;intage;floatscore;charaddr30; stu3;(3)struct intnum;charname20;charsex;intage;floatscore;charaddr30; stu3; 以上定義了一個數組,數組名為以上定義了一個數組,數組名為stu, 有有3個個元素,每個元素為元素,每個元素為student類型數據類型數據 數組各元素在內數組各元素在內存中連續存放。存中連續
12、存放。結構體數組可以初始化,形式類似多維數組。結構體數組可以初始化,形式類似多維數組。struct student intnum;charname20;charsex;intage;float score;char add30;stu3=10101,Li Lin,M,18,86,103 Beijing Road,10102,Zhang Fan,M,19,92,130 Shanghai Road,10103, Wang Min,F,17,80.5,109 Zhongshan Road;結構體數組的引用完全類似于結構體變量的結構體數組的引用完全類似于結構體變量的引用,只是用結構體數組元素來代替結構
13、體引用,只是用結構體數組元素來代替結構體變量,其他規則不變。變量,其他規則不變。stu0.num /引用某一數組元素的成員引用某一數組元素的成員/引用某一數組元素的成員引用某一數組元素的成員stu2=stu1/將結構體數組元素作為一個整體將結構體數組元素作為一個整體 【例例10.2】統計候選人得票數的程序。設有統計候選人得票數的程序。設有3個個候選人,每次輸入候選人,每次輸入1個得票的候選人的名字,要求個得票的候選人的名字,要求最后輸出各個候選人得票結果。最后輸出各個候選人得票結果。解題思路:定義候選人結構體,包括候選人姓名和解題思路:定義候選人結構體,包括候選人姓名和得票數
14、兩個成員;定義具有三個候選人的結構體得票數兩個成員;定義具有三個候選人的結構體數組,并初始化候選人信息;在主函數數組,并初始化候選人信息;在主函數main中輸中輸入候選人名字,與候選人結構體數組中的候選人入候選人名字,與候選人結構體數組中的候選人名字匹配,將匹配上的候選人名字對應的選票數名字匹配,將匹配上的候選人名字對應的選票數加加1;對所有的選民循環匹配。;對所有的選民循環匹配。10.4.1 共用體的概念共用體的概念10.4.2 共用體變量的引用方式共用體變量的引用方式10.4.3 共用體類型數據的特點和應用共用體類型數據的特點和應用需要使幾種不同類型的需要使幾種不同類型的變量變量存放到同一
15、段存放到同一段內存單元中。也就是使用覆蓋技術,幾個內存單元中。也就是使用覆蓋技術,幾個變量變量互相覆蓋。這種幾個不同的互相覆蓋。這種幾個不同的變量變量共同共同占用一段內存的結構稱為共用體。占用一段內存的結構稱為共用體。 “共用體共用體”與與“結構體結構體”的定義形式相似,關鍵字為的定義形式相似,關鍵字為union,有三種定義方式:,有三種定義方式:(1)union 共用體名共用體名 成員表列成員表列;變量名表列變量名表列;union data inti;charch;floatf; a, b, c;“共用體共用體”與與“結構體結構體”的定義形式相似的定義形式相似,關鍵字為,關鍵字為union,
16、有三種定義方式:,有三種定義方式:(2)union data inti;charch;floatf; ; data a, b, c; “共用體共用體”與與“結構體結構體”的定義形式相似的定義形式相似,關鍵字為,關鍵字為union,有三種定義方式:,有三種定義方式:(3)union inti;charch;floatf; a, b, c;“共用體共用體”與與“結構體結構體”的定義形式相似的定義形式相似,關鍵字為,關鍵字為union,有三種定義方式:,有三種定義方式:(3)union inti;charch;floatf; a, b, c;注意區分:注意區分:“共用體共用體”:各成員占相同的起始地
17、址,:各成員占相同的起始地址,所占內存長度等于最長的成員所占內存。所占內存長度等于最長的成員所占內存。“結構體結構體”:各成員占不同的地址,所占:各成員占不同的地址,所占內存長度等于全部成員所占內存之和。內存長度等于全部成員所占內存之和。只有先定義了共用體變量才能引用它。只有先定義了共用體變量才能引用它。例如,前面定義了例如,前面定義了a、b、c為共用體變量為共用體變量,下面的引用方式是正確的:,下面的引用方式是正確的: a.i/引用共用體變量中的整型變量引用共用體變量中的整型變量i a.ch/引用共用體變量中的字符變量引用共用體變量中的字符變量ch a.f/引用共用體變量中的實型變量引用共用
18、體變量中的實型變量f 同結構體類型變量一樣,不能直接輸入和輸出共用體類同結構體類型變量一樣,不能直接輸入和輸出共用體類型變量,輸入輸出時用共用體變量的成員。例如:型變量,輸入輸出時用共用體變量的成員。例如: printf(%d, a); /不能將共用體變量整體輸出不能將共用體變量整體輸出 因為因為a的存儲區有好幾種類型,分別占不同長度的存儲區的存儲區有好幾種類型,分別占不同長度的存儲區,僅寫共用體變量名,僅寫共用體變量名a,難以使系統確定究竟輸出的是哪,難以使系統確定究竟輸出的是哪一個成員的值。一個成員的值。 應該寫成應該寫成printf(%d, a.i)或或printf(%c, a.ch)等
19、。等。 但允許同類型的共用體變量之間賦值。但允許同類型的共用體變量之間賦值。 例如:例如:b=a;在使用共用體類型數據時要注意以下一些在使用共用體類型數據時要注意以下一些特點:特點:(1)同一個內存段可以用來存放幾種不同)同一個內存段可以用來存放幾種不同類型的成員,但在每一瞬時只能存放其中類型的成員,但在每一瞬時只能存放其中一種,而不是同時存放幾種。一種,而不是同時存放幾種。 (2)共用體變量中起作用的成員是最后一)共用體變量中起作用的成員是最后一次賦值的成員。次賦值的成員。 (3)共用體變量的地址和它的各成員的地址是同)共用體變量的地址和它的各成員的地址是同一地址。一地址。 (4)不能企圖引
20、用變量名來得到成員的值;可以)不能企圖引用變量名來得到成員的值;可以對共用體變量初始化,但初始化表中只能有一個對共用體變量初始化,但初始化表中只能有一個常量。常量。 (5)共用體類型可以出現在結構體類型定義中,)共用體類型可以出現在結構體類型定義中,也可以定義共用體數組。反之,結構體也可以出也可以定義共用體數組。反之,結構體也可以出現在共用體類型定義中,數組也可以作為共用體現在共用體類型定義中,數組也可以作為共用體的成員。的成員。 【例例10.3】設有若干個人員的數據,其中有學生設有若干個人員的數據,其中有學生和教師。學生的數據中包括:姓名、號碼、性別和教師。學生的數據中包括:姓名、號碼、性別
21、、職業、班級。教師的數據包括:姓名、號碼、職業、班級。教師的數據包括:姓名、號碼、性別、職業、職務。現要求把它們放在同一表格性別、職業、職務。現要求把它們放在同一表格中,見圖中,見圖10.8。如果。如果“Job”項為項為“S”(學生)(學生),則第,則第5項為項為class(班)。即(班)。即Li是是501班的。班的。如果如果“Job”項是項是“T”(教師),則第(教師),則第5項為項為position(職務)。(職務)。Wang是是prof(教授)。(教授)。 解題思路:可以看出,學生和教師所包含的數據是解題思路:可以看出,學生和教師所包含的數據是不全相同的,所以建立人員結構體,包括姓名、不
22、全相同的,所以建立人員結構體,包括姓名、號碼、性別、職業和分類。其中,分類由職業決號碼、性別、職業和分類。其中,分類由職業決定,用共用體來處理即將定,用共用體來處理即將class和和position放在放在同一段內存中,也就是說,結構體中的同一段內存中,也就是說,結構體中的“分類分類”成員是一個共用體類型。根據題目要求繪制的程成員是一個共用體類型。根據題目要求繪制的程序流程圖如圖序流程圖如圖10.9所示,程序主要由循環輸入所示,程序主要由循環輸入和循環輸出兩部分構成。和循環輸出兩部分構成。 思考題:如果將循環輸入和循環輸出的功思考題:如果將循環輸入和循環輸出的功能分別編寫輸入函數能分別編寫輸入
23、函數input和輸出函數和輸出函數output,主函數,主函數main通過調用輸入和輸通過調用輸入和輸出函數,程序該如何實現?出函數,程序該如何實現?如果一個變量只有幾種可能的值,可以定義如果一個變量只有幾種可能的值,可以定義為枚舉類型。所謂為枚舉類型。所謂“枚舉枚舉”是指將變量的值是指將變量的值一一列舉出來,變量的值只限于列舉出來的一一列舉出來,變量的值只限于列舉出來的值的范圍內。值的范圍內。 定義枚舉類型用定義枚舉類型用enum開頭。例如:開頭。例如:enum weekday sun, mon, tue, wed, thu, fri, sat; 定義了一個枚舉類型定義了一個枚舉類型enum
24、 weekday,可以用此類型來,可以用此類型來定義變量。例如:定義變量。例如:enum weekday workday, week_end; workday和和week_end被定義為枚舉變量,它們的值被定義為枚舉變量,它們的值只能是只能是sun到到sat之一。例如:之一。例如:workday=mon;week_end=sun;也可以直接定義枚舉變量,如:也可以直接定義枚舉變量,如: enum sun, mon, tue, wed, thu, fri, satworkday, week_end;其中其中sun、mon、sat等稱為枚舉元等稱為枚舉元素或枚舉常量,它們是用戶定義的標識符。素或枚
25、舉常量,它們是用戶定義的標識符。 說明:說明:(1)在)在C編譯中,對枚舉元素按常量處理,故稱枚編譯中,對枚舉元素按常量處理,故稱枚舉常量。它們不是變量,不能對它們賦值。舉常量。它們不是變量,不能對它們賦值。 (2)枚舉元素作為常量是有值的,)枚舉元素作為常量是有值的,C語言編譯按定語言編譯按定義時的順序使它們的值為義時的順序使它們的值為0, 1, 2, (3)枚舉值可以用來作比較判斷。)枚舉值可以用來作比較判斷。 (4)一個整數不能直接賦給一個枚舉變量。)一個整數不能直接賦給一個枚舉變量。 【例例10.4】依次輸出依次輸出1到到12月份的英文名稱。月份的英文名稱。解題思路:月份的取值是固定的
26、解題思路:月份的取值是固定的12個,因此可以個,因此可以聲明為枚舉類型。枚舉類型變量的取值是枚舉常聲明為枚舉類型。枚舉類型變量的取值是枚舉常量,其值是整數,目前需要輸出量,其值是整數,目前需要輸出12個月份的英文個月份的英文名稱,所以另外定義一個字符指針數組,保存名稱,所以另外定義一個字符指針數組,保存12個月份對應的英文名稱,用枚舉類型變量的取值個月份對應的英文名稱,用枚舉類型變量的取值作為指針數組的訪問下標,實現通過枚舉常量整作為指針數組的訪問下標,實現通過枚舉常量整型值到英文名稱之間的映射,這是一種通用的輸型值到英文名稱之間的映射,這是一種通用的輸出枚舉變量值的方法。出枚舉變量值的方法。
27、 除了可以直接使用除了可以直接使用C提供的標準類型名(如提供的標準類型名(如int、char、float、double、long等)和自己定義的結構體、共用等)和自己定義的結構體、共用體、枚舉類型外,還可以用體、枚舉類型外,還可以用typedef定義新的類型名來代定義新的類型名來代替已有的類型名。如:替已有的類型名。如:typedef intINTEGER;typedef floatREAL; 指定用指定用INTEGER代表代表int類型,類型,REAL代表代表float。 這樣,以下兩行等價:這樣,以下兩行等價:int i, j; float a, b;INTEGER i, j; REAL
28、a, b; 可以定義結構體類型:可以定義結構體類型:typedef struct int month;int day;int year; DATE; 定義新類型名定義新類型名DATE,它代表上面定義的一個結構體類型,它代表上面定義的一個結構體類型。這時就可以用。這時就可以用DATE定義變量:定義變量:DATE birthday; /不要寫成不要寫成struct DATE birthday; 還可以進一步:還可以進一步:(1)typedef int NUM100; /定義定義NUM為整型數組類型為整型數組類型 NUM n;/定義為整型數組變量定義為整型數組變量(2)typedef char *STRING; /定義定義STRING為字符指針類型為字符指針類型 STRING p, s10; /p為字符指針變量,為字符指針變量,s為指針數組為指針數組(3)typedef int ( * POINTER)() /定義定義POINTER為指向函為指向函數的指針類型數的指針類型 POINTER p1, p2; /p1、p2為為POINTER類型的指針變量類型的指針變量歸納起來,定義一個新的類型名的方法是:歸納起來,定義一個新的類型名的方法是:(1)先按定義變量的方法寫出定義體(如:)先按定義變量的方法寫出定義體(如:int i;);(2)將變量名換成新類型名(如:
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 新能源汽車廢舊電池梯次利用2025年產業布局與可行性研究報告
- 跟崗學習培訓心得體會模版
- 剛進公司工作總結模版
- 2025年高三上學期工作總結模版
- 初中課堂教學改革總結模版
- 二年級上學期班主任工作總結模版
- 中藥配方顆粒質量標準與市場競爭格局演變及應對策略研究報告
- 2025年單位人事個人年度工作總結模版
- AI助力醫學研究同時保障患者權益和隱私安全的方法探討
- 辦公設備質量管理提升工作效率的基石
- 2025年中國電子產品租賃行業市場占有率及投資前景預測分析報告
- 工程師評審代辦合同協議
- 小班健康活動:我會吃魚
- 專利代理師考試題庫含答案2024
- 珠寶并購策略優化-全面剖析
- DB12 T1230-2023 政務信息資源共享 總體框架
- 管道拆除專項施工方案
- 廣西壯族自治區馬山縣實驗高中-雙休背后:從“要我學”到“我要學”的轉變-高三家長會【課件】
- AI時代職業院校財會類專業課程教學改革探討
- GB/Z 27021.13-2025合格評定管理體系審核認證機構要求第13部分:合規管理體系審核與認證能力要求
- 湖南省長沙市四大名校2024-2025學年高三2月月考語文試題(原卷版+解析版)
評論
0/150
提交評論