C語言程序設(shè)計_10共用體與枚舉_第1頁
C語言程序設(shè)計_10共用體與枚舉_第2頁
C語言程序設(shè)計_10共用體與枚舉_第3頁
C語言程序設(shè)計_10共用體與枚舉_第4頁
C語言程序設(shè)計_10共用體與枚舉_第5頁
已閱讀5頁,還剩18頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、第第10章章 共用體與枚舉共用體與枚舉10.1 共用體共用體10.2 枚舉枚舉10.3 位運算與位段結(jié)構(gòu)位運算與位段結(jié)構(gòu)10.4 用用TYPEDEF定義類型名定義類型名本章小結(jié)本章小結(jié)10.1 共共 用用 體體10.1.1 共用體變量的定義共用體變量的定義共用體類型的定義形式與結(jié)構(gòu)體類型的定義形式相同,共用體類型的定義形式與結(jié)構(gòu)體類型的定義形式相同,只是其類型關(guān)鍵字不同,共用體的關(guān)鍵字為只是其類型關(guān)鍵字不同,共用體的關(guān)鍵字為UNION。一般格式為:一般格式為:UNION共用體類型名 成員說明列表成員說明列表;例如:例如:UNION DATA INT I; CHAR CH; FLOAT F;同定

2、義結(jié)構(gòu)體變量一樣,定義共同體變量也有同定義結(jié)構(gòu)體變量一樣,定義共同體變量也有3種方式:種方式:(1)先定義共用體類型,再定義共用體類型變量。)先定義共用體類型,再定義共用體類型變量。(2)在定義共用體類型的同時定義共用體類型變量。)在定義共用體類型的同時定義共用體類型變量。(3)定義共用體類型時,省略共用體類型名,同時定義共)定義共用體類型時,省略共用體類型名,同時定義共用體類型變量。用體類型變量。10.1.2 共用體變量的引用共用體變量的引用在定義共用體變量之后,就可以引用該共用體變量的某個成在定義共用體變量之后,就可以引用該共用體變量的某個成員,引用方式與引用結(jié)構(gòu)體變量中的成員相似。員,引

3、用方式與引用結(jié)構(gòu)體變量中的成員相似。但是應(yīng)當注意,一個共用體變量不是同時存放多個成員的值,但是應(yīng)當注意,一個共用體變量不是同時存放多個成員的值,而只能存放其中的一個值,這就是最后賦給它的值。例如:而只能存放其中的一個值,這就是最后賦給它的值。例如:A.I=278;A.CH=D;A.F=5.78;共用體變量共用體變量A中最后的值是中最后的值是5.78。所以不能企圖通過下面的。所以不能企圖通過下面的PRINTF函數(shù)得到函數(shù)得到A.I和和A.CH的值,但能得到的值,但能得到A.F的值。的值。PRINTF(“%D,%C,%F”,A.I,A.CH,A.F);也可以通過指針變量引用共用體變量中的成員,例如

4、:也可以通過指針變量引用共用體變量中的成員,例如:UNION DATA *PT,X;PT=&X;PT-I=278;PT-CH=D;PT-F=5.78;PT是指向是指向UNION DATA類型變量的指針變量,先使它指向類型變量的指針變量,先使它指向共用體變量共用體變量X。此時。此時PT-I相當于相當于X.I,這和結(jié)構(gòu)體變量中的,這和結(jié)構(gòu)體變量中的用法相似。用法相似。不能直接用共用體變量名進行輸入不能直接用共用體變量名進行輸入/輸出。輸出?!纠?0.1】寫出下列程序的執(zhí)行結(jié)果。寫出下列程序的執(zhí)行結(jié)果。10.1.3 共用體變量的應(yīng)用共用體變量的應(yīng)用從前面的介紹可知,共用體雖然可以有多個成員

5、,但在某一從前面的介紹可知,共用體雖然可以有多個成員,但在某一時刻,只能使用其中的一個成員。共用體一般不單獨使用,時刻,只能使用其中的一個成員。共用體一般不單獨使用,通常作為結(jié)構(gòu)體的成員,這樣結(jié)構(gòu)體可根據(jù)不同情況放不同通常作為結(jié)構(gòu)體的成員,這樣結(jié)構(gòu)體可根據(jù)不同情況放不同類型的數(shù)據(jù)。類型的數(shù)據(jù)。例如,需要把學生和教師的數(shù)據(jù)放在一起處理。學生和教師例如,需要把學生和教師的數(shù)據(jù)放在一起處理。學生和教師的數(shù)據(jù)相同的部分有:姓名、編號和身份。但也有不同的部的數(shù)據(jù)相同的部分有:姓名、編號和身份。但也有不同的部分:學生需要保存分:學生需要保存10門課程的分數(shù),分數(shù)用浮點數(shù)表示,教門課程的分數(shù),分數(shù)用浮點數(shù)表

6、示,教師則保存工作情況簡介,用字符串表示。教師和學生的不同師則保存工作情況簡介,用字符串表示。教師和學生的不同部分可以用共用體描述。部分可以用共用體描述。10.2 枚枚 舉舉枚舉類型定義的一般格式為:枚舉類型定義的一般格式為:ENUM 枚舉類型名標識符1,標識符2,標識符N;針對枚舉類型有幾點說明:針對枚舉類型有幾點說明:(1)ENUM是關(guān)鍵字,標識枚舉類型,定義枚舉類型必須是關(guān)鍵字,標識枚舉類型,定義枚舉類型必須以以ENUM開頭。開頭。(2)在定義枚舉類型時,花括號中的名字稱為枚舉元素或)在定義枚舉類型時,花括號中的名字稱為枚舉元素或枚舉常量。它們是程序設(shè)計者自己指定的,定名規(guī)則與標識枚舉常

7、量。它們是程序設(shè)計者自己指定的,定名規(guī)則與標識符相同。這些名字并無固定的含義,只是一個符號,程序設(shè)符相同。這些名字并無固定的含義,只是一個符號,程序設(shè)計者僅僅是為了提高程序的可讀性才使用這些名字。計者僅僅是為了提高程序的可讀性才使用這些名字。(3)枚舉元素不是變量,不能改變其值。例如,下面這些)枚舉元素不是變量,不能改變其值。例如,下面這些賦值是不對的:賦值是不對的:RED=8;YELLOW=9;但枚舉元素作為常量,它們是有值的。從花括號的第一個元但枚舉元素作為常量,它們是有值的。從花括號的第一個元素開始,值分別是素開始,值分別是0、1、2、3、4,這是系統(tǒng)自動賦給的,這是系統(tǒng)自動賦給的,可以

8、輸出??梢暂敵?。(4)枚舉常量可以進行比較。)枚舉常量可以進行比較。(5)一個枚舉變量的值只能是這幾個枚舉常量之一,可以)一個枚舉變量的值只能是這幾個枚舉常量之一,可以將枚舉常量賦給一個枚舉變量。但不能將一個整數(shù)賦給它。將枚舉常量賦給一個枚舉變量。但不能將一個整數(shù)賦給它。(6)枚舉常量不是字符串,不能用下面的方法輸出字符串)枚舉常量不是字符串,不能用下面的方法輸出字符串“RED”?!纠?0.2】枚舉類型應(yīng)用舉例。枚舉類型應(yīng)用舉例。10.3 位運算與位段結(jié)構(gòu)位運算與位段結(jié)構(gòu)10.3.1 位運算位運算位運算符主要有:位運算符主要有:&,|,和和。(1)&(按位(按位“與與”)運算

9、規(guī)則為:運算規(guī)則為:0&0=0,0&1=0,1&0=0,1&1=1例如,例如,-5&3的值為的值為3。其中。其中-5的補碼(為簡便起見,用的補碼(為簡便起見,用8位二位二進制表示)為進制表示)為1111 1011,3的補碼為的補碼為0000 0011,按位與的結(jié),按位與的結(jié)果為果為0000 0011,即值為十進制數(shù),即值為十進制數(shù)3。(2)|(按位(按位“或或”)運算規(guī)則為:運算規(guī)則為:0|0=0,0|1=1,1|0=1,1|1=1例如,例如,-5|3的值為的值為-5。-5與與3按位或后得按位或后得11111011,其真值為,其真值為-0000101,即

10、,即-5。(3)(按位(按位“異或異或”)運算規(guī)則為:運算規(guī)則為:00=0,01=1,10=1,11=0例如,例如,-53的值為的值為-8。(4)(按位(按位“取反取反”)運算規(guī)則為:運算規(guī)則為:0=1,1=0例如,例如,7的值為的值為-8。(5)(左移)(左移)例如,例如,3(右移)(右移)移動對象為正數(shù)時,高位補移動對象為正數(shù)時,高位補0。為負數(shù)時,邏輯右移,高位。為負數(shù)時,邏輯右移,高位補補0;算術(shù)右移,高位補;算術(shù)右移,高位補1。VISUAL C+ 6.0和和TURBO C 2.0采用的是算術(shù)右移,有的采用的是算術(shù)右移,有的C語言版本則采用邏輯右移。語言版本則采用邏輯右移。例如,例如,

11、-32,將,將3右移右移2位,左邊(最高位)補位,左邊(最高位)補1,結(jié)果為,結(jié)果為-1。10.3.2 位段結(jié)構(gòu)位段結(jié)構(gòu)位段結(jié)構(gòu)也是一種結(jié)構(gòu)體類型,只不過其中含有以位為單位位段結(jié)構(gòu)也是一種結(jié)構(gòu)體類型,只不過其中含有以位為單位定義存儲長度的整數(shù)類型位段成員。在某些應(yīng)用中,特別是定義存儲長度的整數(shù)類型位段成員。在某些應(yīng)用中,特別是對硬件端口的操作,需要標志某些端口的狀態(tài)或特征。而這對硬件端口的操作,需要標志某些端口的狀態(tài)或特征。而這些狀態(tài)或特征只需要一個機器字中的一位或連續(xù)若干位來表些狀態(tài)或特征只需要一個機器字中的一位或連續(xù)若干位來表示。采用位段結(jié)構(gòu)既節(jié)省存儲空間,又可方便操作。示。采用位段結(jié)構(gòu)既

12、節(jié)省存儲空間,又可方便操作。位段結(jié)構(gòu)中位段的定義格式為:位段結(jié)構(gòu)中位段的定義格式為:UNSIGNED :對對16位的位的TURBO C 2.0而言,而言,DATA變量的內(nèi)存分配示意圖變量的內(nèi)存分配示意圖如圖如圖10-2所示。所示。圖圖10-2 data變量的內(nèi)存分配示意圖變量的內(nèi)存分配示意圖應(yīng)該注意的是,應(yīng)該注意的是,16位的位的TURBO C 2.0的字邊界在的字邊界在2倍字節(jié)處,倍字節(jié)處,其他的其他的C語言的字邊界可能在若干倍字節(jié)處(如語言的字邊界可能在若干倍字節(jié)處(如VISUAL C+ 6.0在在4倍字節(jié)處)。倍字節(jié)處)。位段數(shù)據(jù)的引用,同結(jié)構(gòu)體成員中的數(shù)據(jù)引用一樣,但應(yīng)注位段數(shù)據(jù)的引用

13、,同結(jié)構(gòu)體成員中的數(shù)據(jù)引用一樣,但應(yīng)注意位段的最大取值范圍不要超出二進制位數(shù)確定的范圍,否意位段的最大取值范圍不要超出二進制位數(shù)確定的范圍,否則超出部分會丟棄。則超出部分會丟棄。關(guān)于位段數(shù)據(jù),注意以下幾點:關(guān)于位段數(shù)據(jù),注意以下幾點:(1)一個位段必須存儲在同一存儲單元(即字)之中,不)一個位段必須存儲在同一存儲單元(即字)之中,不能跨兩個單元。如果其單元空間不夠,則剩余空間不用,從能跨兩個單元。如果其單元空間不夠,則剩余空間不用,從下一個單元起存放該位段。下一個單元起存放該位段。(2)可以通過定義長度為)可以通過定義長度為0的位段的方式使下一位段從下一的位段的方式使下一位段從下一存儲單元開始

14、。存儲單元開始。(3)可以定義無名位段。)可以定義無名位段。(4)位段的長度不能大于存儲單元的長度。)位段的長度不能大于存儲單元的長度。(5)位段無地址,不能對位段進行取地址運算。)位段無地址,不能對位段進行取地址運算。(6)位段可以以)位段可以以%D、%O、%X格式輸出。格式輸出。(7)位段若出現(xiàn)在表達式中,將被系統(tǒng)自動轉(zhuǎn)換成整數(shù)。)位段若出現(xiàn)在表達式中,將被系統(tǒng)自動轉(zhuǎn)換成整數(shù)?!纠?0.3】試編一個程序,將一個十六進制整數(shù)(占試編一個程序,將一個十六進制整數(shù)(占2字節(jié))字節(jié))的各位循環(huán)左移的各位循環(huán)左移4個二進制位,如個二進制位,如2FE1循環(huán)左移循環(huán)左移4個二進制位個二進制位后為后為F

15、E12。10.4 用用TYPEDEF定義類型名定義類型名1簡單的名字替換簡單的名字替換例如:例如:TYPEDEF INT INTEGER;意思是將意思是將INT型定義為型定義為INTEGER,這兩者等價,在程序中,這兩者等價,在程序中就可以用就可以用INTEGER作為類型名來定義變量了。例如:作為類型名來定義變量了。例如:INTEGER X,Y; /* 相當于INT X,Y; */2定義一個類型名代表一個結(jié)構(gòu)體類型定義一個類型名代表一個結(jié)構(gòu)體類型3定義數(shù)組類型定義數(shù)組類型例如:例如:TYPEDEF INT COUNT20;COUNT A,B;定義定義COUNT為整型數(shù)組,為整型數(shù)組,A、B為為

16、COUNT類型的整型數(shù)組。類型的整型數(shù)組。4定義指針類型定義指針類型例如:例如:TYPEDEF CHAR *STRING;STRING P1,P2,P10;定義定義STRING為字符指針類型,為字符指針類型,P1、P2為字符指針變量,為字符指針變量,P為字符指針數(shù)組。為字符指針數(shù)組。還可以有其他方法。歸納起來,用還可以有其他方法。歸納起來,用TYPEDEF定義一個新類定義一個新類型名的方法如下:型名的方法如下:(1)先按定義變量的方法寫出定義體(如)先按定義變量的方法寫出定義體(如CHAR A20;)。)。(2)將變量名換成新類型名(如)將變量名換成新類型名(如CHAR NAME20;)。)。

17、(3)在最前面加上)在最前面加上TYPEDEF(如(如TYPEDEF CHAR NAME20;)。)。(4)然后可以用新類型名去定義變量(如)然后可以用新類型名去定義變量(如NAME C,D;)。)。 本本 章章 小小 結(jié)結(jié)1共用體數(shù)據(jù)類型是指將不同的數(shù)據(jù)項存放于同一段內(nèi)存共用體數(shù)據(jù)類型是指將不同的數(shù)據(jù)項存放于同一段內(nèi)存單元的一種構(gòu)造數(shù)據(jù)類型。同定義結(jié)構(gòu)體變量一樣,定義共單元的一種構(gòu)造數(shù)據(jù)類型。同定義結(jié)構(gòu)體變量一樣,定義共同體變量也有同體變量也有3種方式:先定義共用體類型,再定義共用體種方式:先定義共用體類型,再定義共用體類型變量;在定義共用體類型的同時定義共用體類型變量;類型變量;在定義共用

18、體類型的同時定義共用體類型變量;定義共用體類型時,省略共用體類型名,同時定義共用體類定義共用體類型時,省略共用體類型名,同時定義共用體類型變量。型變量。注意:注意:(1)共用體變量所占內(nèi)存長度等于最長的成員的長度。)共用體變量所占內(nèi)存長度等于最長的成員的長度。(2)不能直接引用共用體變量,只能引用共用體變量中的)不能直接引用共用體變量,只能引用共用體變量中的成員。引用格式為:成員。引用格式為:共用體變量.成員名(3)在同一段內(nèi)存中可以用來存放幾種不同類型的成員,)在同一段內(nèi)存中可以用來存放幾種不同類型的成員,但在每一瞬間只能存放其中一種,而不是同時存放幾種。但在每一瞬間只能存放其中一種,而不是

19、同時存放幾種。(4)共用體變量中起作用的成員是最后一次存放的成員,)共用體變量中起作用的成員是最后一次存放的成員,在存入一個新的成員后原有成員就失去作用。引用共用體變在存入一個新的成員后原有成員就失去作用。引用共用體變量應(yīng)注意當前存放在共用體變量中的究竟是哪一個成員。量應(yīng)注意當前存放在共用體變量中的究竟是哪一個成員。(5)共用體變量的地址和它的各成員的地址都是同一個地)共用體變量的地址和它的各成員的地址都是同一個地址。址。2枚舉類型是指變量的取值只能限于事前已經(jīng)一一列舉出枚舉類型是指變量的取值只能限于事前已經(jīng)一一列舉出來的值的范圍。定義枚舉類型的格式為:來的值的范圍。定義枚舉類型的格式為:ENUM 枚舉類型名(枚舉常量列表);枚舉變量的定義格式為:枚舉變量的定義格式為:ENUM 枚舉類型名 枚舉變量名;注意注意(1)枚舉常量是有值的,)枚舉常量是有值的,C語言按定義時的順序使它們的值語言按定義時的順序使它們的值為為0,1,2,也可以改變枚舉元素的值,

溫馨提示

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

最新文檔

評論

0/150

提交評論