第10章--共同體及枚舉類型_第1頁(yè)
第10章--共同體及枚舉類型_第2頁(yè)
第10章--共同體及枚舉類型_第3頁(yè)
第10章--共同體及枚舉類型_第4頁(yè)
第10章--共同體及枚舉類型_第5頁(yè)
已閱讀5頁(yè),還剩32頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、1第10章 共用體與枚舉類型v 共同體類型與共同體變量共同體類型與共同體變量v 共同體變量的引用共同體變量的引用v 位運(yùn)算與位段結(jié)構(gòu)位運(yùn)算與位段結(jié)構(gòu)v 枚舉類型枚舉類型v 類型定義類型定義23.舉例舉例union intchar int i; char ch3; v,*pv; 2. 用途:用途:使幾個(gè)不同類型的變量共占一段內(nèi)存使幾個(gè)不同類型的變量共占一段內(nèi)存(相互覆蓋相互覆蓋)。 1. .共用體數(shù)據(jù)類型的概念共用體數(shù)據(jù)類型的概念: 將不同類型的數(shù)據(jù)項(xiàng)存放于同一段內(nèi)存單元的一種構(gòu)造將不同類型的數(shù)據(jù)項(xiàng)存放于同一段內(nèi)存單元的一種構(gòu)造數(shù)據(jù)類型。數(shù)據(jù)類型。v.chv.i共用體共用體變量任何時(shí)刻變量任何時(shí)

2、刻只有只有一個(gè)成員一個(gè)成員存在存在10.1 共用體共用體類型與共用體變量類型與共用體變量310.1.1共用體的概念共用體的概念 使幾個(gè)不同的變量共占同一段內(nèi)存的結(jié)構(gòu)稱為 “共用體”類型的結(jié)構(gòu).定義共用體類型變量的一般形式為:unionunion共用體名 成員表列 變量表列;圖11-2410.1 共用體共用體類型與共用體變量類型與共用體變量union data int i; char ch; float f; ;4共同體類型變量的定義(1) 先定義共同體類型,再定義共同體類型變量 union data char ch; float f; union data a,b,c;5共同體類型變量的定義(

3、2) 在定義共用體類型的同時(shí)定義共用體類型變量 union data int i; char ch; float f;a,b,c; 6共同體類型變量的定義(3)定義共用體類型時(shí),省略共用體類型名,同時(shí)定義共用體類型變量 union int i;char ch;float f;a,b,c ;7共用體和結(jié)構(gòu)體的比較:共用體和結(jié)構(gòu)體的比較: 結(jié)構(gòu)體變量所占內(nèi)存長(zhǎng)度是各成員占的內(nèi)存長(zhǎng)度之和。每個(gè)成員分別占有其自己的內(nèi)存單元。 共用體變量所占的內(nèi)存長(zhǎng)度等于最長(zhǎng)的成員的長(zhǎng)度。 例如例如: :上面定義的“共用體”變量、各占個(gè)字節(jié)(因?yàn)橐粋€(gè)實(shí)型變量占個(gè)字節(jié)),而不是各占個(gè)字節(jié)。 10.1 共用體共用體類型與共

4、用體變量類型與共用體變量810.2.1 10.2.1 共用體變量的引用方式共用體變量的引用方式 只有先定義了共用體變量才能引用它,而且不能引用共用體變量,而只能引用共用體變量中的成員。例如例如:前面定義了前面定義了a、b、c為共用體變量為共用體變量 a.i (引用共用體變量中的整型變量) a.ch(引用共用體變量中的字符變量) a.f (引用共用體變量中的實(shí)型變量)10.2 共用體共用體變量的引用變量的引用910.2.2 10.2.2 共用體類型數(shù)據(jù)的特點(diǎn)共用體類型數(shù)據(jù)的特點(diǎn)(1)同一個(gè)內(nèi)存段可以用來(lái)存放幾種不同類型的成員,但在每一瞬時(shí)只能存放其中一種,而不是同時(shí)存放幾種。(2) 共用體變量中

5、起作用的成員是最后一次存放的成員,在存入一個(gè)新的成員后原有的成員就失去作用。 (3) 共用體變量的地址和它的各成員的地址都是同一地址。 10.2 共用體共用體變量的引用變量的引用10(4) 不能對(duì)共用體變量名賦值,也不能企圖引用變量名來(lái)得到一個(gè)值,又不能在定義共用體變量時(shí)對(duì)它初始化。(5) 不能把共用體變量作為函數(shù)參數(shù),也不能使函數(shù)帶回共用體變量,但可以使用指向共用體變量的指針 (6) 共用體類型可以出現(xiàn)在結(jié)構(gòu)體類型定義中,也可以定義共用體數(shù)組。反之,結(jié)構(gòu)體也可以出現(xiàn)在共用體類型定義中,數(shù)組也可以作為共用體的成員。10.2 共用體共用體變量的引用變量的引用11例例 設(shè)有若干個(gè)人員的數(shù)據(jù),其中有

6、學(xué)生和教師。學(xué)生的數(shù)據(jù)中包括:姓名、號(hào)碼、性別、職業(yè)、班級(jí)。教師的數(shù)據(jù)包括:姓名、號(hào)碼、性別、職業(yè)、職務(wù)。可以看出,學(xué)生和教師所包含的數(shù)據(jù)是不同的。現(xiàn)要求把它們放在同一表格中。圖11-2510.3 共用體共用體變量的應(yīng)用變量的應(yīng)用1210.3 共用體共用體變量的應(yīng)用變量的應(yīng)用13#include structint num;char name10;char sex;char job;unionint banji;char position10;category;person2;/*先設(shè)人數(shù)為2*/10.3 共用體共用體變量的應(yīng)用變量的應(yīng)用14void main()int i;for(i=0;i

7、2;i+)scanf(%d %s %c %c, &personi.num, &,&personi.sex, &personi.job);if(personi.job = S)scanf(%d, &personi.category.banji);else if(personi.job = T)scanf(%s, personi.category.position);else printf(“Input error!”); printf(n);printf(No. name sex job class/positionn);for(i=0;i2;i+)if (personi

8、.job = S)printf(“%-6d%-10s%-3c%-3c%-6dn”,personi.num, , personi.sex, personi.job, personi.category.banji);else printf(“%-6d%-10s%-3c%-3c%-6sn”,personi.num, ,personi.sex, personi.job, personi.category.position);運(yùn)行情況如下: 153. 位運(yùn)算有:位運(yùn)算有: “按位與按位與” 運(yùn)算運(yùn)算 “按位或按位或” 運(yùn)算運(yùn)算 “異或異或” 運(yùn)算運(yùn)算 “取

9、反取反” 運(yùn)算運(yùn)算 左移運(yùn)算左移運(yùn)算 右移運(yùn)算右移運(yùn)算 1. .位運(yùn)算和指針一樣,都是位運(yùn)算和指針一樣,都是C語(yǔ)言的重要特色。語(yǔ)言的重要特色。 2. .位運(yùn)算位運(yùn)算的概念的概念: 所謂位運(yùn)算,是指進(jìn)行二進(jìn)制位的運(yùn)算。所謂位運(yùn)算,是指進(jìn)行二進(jìn)制位的運(yùn)算。 例如:將一個(gè)存儲(chǔ)單元中的各二進(jìn)制位左移或右移例如:將一個(gè)存儲(chǔ)單元中的各二進(jìn)制位左移或右移1位,位,兩個(gè)數(shù)按位相加等。兩個(gè)數(shù)按位相加等。 位運(yùn)算符位運(yùn)算符含義含義舉例舉例&按位與按位與a&b|按位或按位或a|b按位異或按位異或ab按位取反按位取反a左移左移a右移右移b210.4 位運(yùn)算與位段結(jié)構(gòu)位運(yùn)算與位段結(jié)構(gòu)16 4. .位賦值運(yùn)算符位賦值運(yùn)算

10、符 位賦值運(yùn)算符是位運(yùn)算符與賦值運(yùn)算符的結(jié)合。位賦值運(yùn)算符是位運(yùn)算符與賦值運(yùn)算符的結(jié)合。 位賦值運(yùn)算符位賦值運(yùn)算符含義含義舉例舉例等同于等同于&=位與賦值位與賦值a&=ba=a&b|=位或賦值位或賦值a|=ba=a|b=位異或賦值位異或賦值a=ba=ab=左移賦值左移賦值a=ba=a=右移賦值右移賦值a=ba=ab10.4 位運(yùn)算與位段結(jié)構(gòu)位運(yùn)算與位段結(jié)構(gòu)1710.4 位運(yùn)算與位段結(jié)構(gòu)位運(yùn)算與位段結(jié)構(gòu)程序:main( ) int num,bit,i; unsigned test=0 x8000; printf(input mum:); scanf(%d,&num); printf(binary

11、 of %x is: ,num); for(i=1;i=1; 運(yùn)行結(jié)果:運(yùn)行結(jié)果:input num:12345 binary of 3039 is: 0011000000111001例例 輸出一個(gè)整數(shù)的二進(jìn)制形式。輸出一個(gè)整數(shù)的二進(jìn)制形式。 5. . 舉例舉例18 信息的存取一般以字節(jié)為單位。實(shí)際上,有時(shí)存儲(chǔ)一個(gè)信息不必用一個(gè)或多個(gè)字節(jié),例如,“真”或“假”用或表示,只需位即可。在計(jì)算機(jī)用于過(guò)程控制、參數(shù)檢測(cè)或數(shù)據(jù)通信領(lǐng)域時(shí),控制信息往往只占一個(gè)字節(jié)中的一個(gè)或幾個(gè)二進(jìn)制位,常常在一個(gè)字節(jié)中放幾個(gè)信息。 5. . 位段(略)位段(略)10.4 位運(yùn)算與位段結(jié)構(gòu)位運(yùn)算與位段結(jié)構(gòu)19可以人為地將一

12、個(gè)整型變量data分為幾部分。 但是用這種方法給一個(gè)字節(jié)中某幾位賦值太麻煩。可以位段結(jié)構(gòu)體的方法。 怎樣向一個(gè)字節(jié)中的一個(gè)或幾個(gè)二進(jìn)制位賦值和改變它的值呢?可以用以下兩種方法:(2)位段 C語(yǔ)言允許在一個(gè)結(jié)構(gòu)體中以位為單位來(lái)指定其成員所占內(nèi)存長(zhǎng)度,這種以位為單位的成員稱為“位段”或稱“位域” ( bit field) 。利用位段能夠用較少的位數(shù)存儲(chǔ)數(shù)據(jù)。 20程序如下:struct packed-data unsigned :; unsigned:; unsigned:; unsigned:; int ; data; 21(1)位段成員的類型必須指定為unsigned或int類型。(2) 若某

13、一位段要從另一個(gè)字開(kāi)始存放,可用以下形式定義:unsigned :1;unsignedb:;一個(gè)存儲(chǔ)單元 unsigned:;unsigned:;另一存儲(chǔ)單元 a、b、c應(yīng)連續(xù)存放在一個(gè)存儲(chǔ)單元中,由于用了長(zhǎng)度為的位段,其作用是使下一個(gè)位段從下一個(gè)存儲(chǔ)單元開(kāi)始存放。因此,只將a、b存儲(chǔ)在一個(gè)存儲(chǔ)單元中,c另存在下一個(gè)單元(“存儲(chǔ)單元”可能是一個(gè)字節(jié),也可能是2個(gè)字節(jié),視不同的編譯系統(tǒng)而異)。 關(guān)于位段的定義和引用的說(shuō)明:22(3) 一個(gè)位段必須存儲(chǔ)在同一存儲(chǔ)單元中,不能跨兩個(gè)單元。如果第一個(gè)單元空間不能容納下一個(gè)位段,則該空間不用,而從下一個(gè)單元起存放該位段。(4) 可以定義無(wú)名位段。(5)

14、位段的長(zhǎng)度不能大于存儲(chǔ)單元的長(zhǎng)度,也不能定義位段數(shù)組。(6) 位段可以用整型格式符輸出。(7) 位段可以在數(shù)值表達(dá)式中引用,它會(huì)被系統(tǒng)自動(dòng)地轉(zhuǎn)換成整型數(shù)。 關(guān)于位段的定義和引用的說(shuō)明:232. 枚舉類型和枚舉變量的定義枚舉類型和枚舉變量的定義:enum weekday sun,mon,tue,wed,thu,fri,sat; enum weekday workday;10.5 枚舉類型枚舉類型 1. .枚舉枚舉數(shù)據(jù)類型的概念數(shù)據(jù)類型的概念: 所謂所謂“枚舉枚舉”是指將變量的所有取值一一列出,變量的是指將變量的所有取值一一列出,變量的值只在列舉出來(lái)的值的范圍內(nèi)。值只在列舉出來(lái)的值的范圍內(nèi)。 24

15、說(shuō)明: 在編譯中,對(duì)枚舉元素按常量處理,故稱枚舉 常量。它們不是變量,不能對(duì)它們賦值。 (2) 枚舉元素作為常量,它們是有值的,語(yǔ)言編譯 按定義時(shí)的順序使它們的值為, (3) 枚舉值可以用來(lái)作判斷比較。 (4) 一個(gè)整數(shù)不能直接賦給一個(gè)枚舉變量。 10.5 枚舉類型枚舉類型25例13口袋中有紅、黃、藍(lán)、白、黑5種顏色的球若干個(gè)。每次從口袋中先后取出個(gè)球,問(wèn)得到3種不同色的球的可能取法,輸出每種排列的情況。 算法:圖11-27,11-28 10.5 枚舉類型枚舉類型26#include main()enum color red,yellow,blue,white,black; enum colo

16、r i,j,k,pri; int n,loop;n=0; for (i=red;i=black;i+) for (j=red;j=black;j+)if (i!=j) for (k=red;k=black;k+)if (k!=i) & (k!=j)n=n+1;printf(%-4d,n);for (loop=1;loop=3;loop+)switch (loop)case 1: pri=i;break; case 2: pri=j;break; case 3: pri=k;break; default:break; 27switch (pri)case red:printf(%-10s,red

17、); break;case yellow: printf(%-10s,yellow); break;case blue: printf(%-10s,blue); break;case white: printf(%-10s,white); break;case black: printf(%-10s,black); break;default :break; printf(n); printf(ntotal:%5dn,n);運(yùn)行情況如下:1redyellowblue2redyellowwhite3redyellowblack58blackwhitered59blackwhiteyellow60

18、blackwhiteblue total:60 283.舉例舉例例例I 定義基本類型名為新類型名。如:定義基本類型名為新類型名。如: typedeffloat REAL; 則此后可以使用則此后可以使用REAL代替代替floa。 即:即:REAL a,b; 等價(jià)于等價(jià)于 float a,b; 2. 作用:用新類型名代替已有類型名。作用:用新類型名代替已有類型名。新類型名為用戶標(biāo)識(shí)符。而已有類型名可以是:基本新類型名為用戶標(biāo)識(shí)符。而已有類型名可以是:基本數(shù)據(jù)類型名、指針、結(jié)構(gòu)體、共用體、枚舉類型。數(shù)據(jù)類型名、指針、結(jié)構(gòu)體、共用體、枚舉類型。 10.6 類型定義類型定義(typedef 語(yǔ)句)語(yǔ)句)

19、 1. . typedef語(yǔ)句的一般格式為:語(yǔ)句的一般格式為: typedef 已有類型名已有類型名 新類型名;新類型名;293.舉例舉例例例II 將已經(jīng)定義的結(jié)構(gòu)體類型的標(biāo)識(shí)符重新定義為將已經(jīng)定義的結(jié)構(gòu)體類型的標(biāo)識(shí)符重新定義為新類型名。新類型名。如:如: struct data int year; int month; int day; ; typedef struct data DATA; 則此后語(yǔ)句:則此后語(yǔ)句:DATA d; 等價(jià)于等價(jià)于 struct data d; 10.6 類型定義類型定義(typedef 語(yǔ)句)語(yǔ)句)303.舉例舉例例例III 將結(jié)構(gòu)體類型直接定義為新類型名。將

20、結(jié)構(gòu)體類型直接定義為新類型名。如:如: typedef struct data int year; int month; int day; DATA; 則可以使用則可以使用新類型名定義變量:新類型名定義變量:DATA d;10.6 類型定義類型定義(typedef 語(yǔ)句)語(yǔ)句)314. 對(duì)對(duì) typedef 語(yǔ)句的說(shuō)明:語(yǔ)句的說(shuō)明: typedef只是為現(xiàn)有的類型提供了一個(gè)易于使用、只是為現(xiàn)有的類型提供了一個(gè)易于使用、可識(shí)別的別名,它并沒(méi)有創(chuàng)建一種新的類型。可識(shí)別的別名,它并沒(méi)有創(chuàng)建一種新的類型。 typedef的作用域取決于的作用域取決于typedef語(yǔ)句所在的位置。語(yǔ)句所在的位置。與變量作

21、用域類似。與變量作用域類似。5. 思考討論思考討論設(shè)有如下說(shuō)明設(shè)有如下說(shuō)明 typedef struct ST long a; int b; char c2; NEW; 則下面敘述中正確的是則下面敘述中正確的是_。 A)以上的說(shuō)明形式非法以上的說(shuō)明形式非法 B)ST是一個(gè)結(jié)構(gòu)體類型是一個(gè)結(jié)構(gòu)體類型 C)NEW是一個(gè)結(jié)構(gòu)體類型是一個(gè)結(jié)構(gòu)體類型 D)NEW是一個(gè)結(jié)構(gòu)體變量是一個(gè)結(jié)構(gòu)體變量 10.6 類型定義類型定義(typedef 語(yǔ)句)語(yǔ)句)32用typedef定義類型的方法 先按定義變量的方法寫(xiě)出定義體(如:int i)。 將變量名換成新類型名(例如:將i換成COUNT)。 在最前面加 (例如:typedef int COUNT)。

溫馨提示

  • 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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論