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

下載本文檔

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

文檔簡(jiǎn)介

第10章共用體與枚舉類(lèi)型

共同體類(lèi)型與共同體變量

共同體變量的引用

位運(yùn)算與位段結(jié)構(gòu)枚舉類(lèi)型類(lèi)型定義13.舉例unionintchar{inti;charch[3];}v,*pv;2.用途:使幾個(gè)不同類(lèi)型的變量共占一段內(nèi)存(相互覆蓋)。

1.共用體數(shù)據(jù)類(lèi)型的概念:

將不同類(lèi)型的數(shù)據(jù)項(xiàng)存放于同一段內(nèi)存單元的一種構(gòu)造數(shù)據(jù)類(lèi)型。v.chv.i共用體變量任何時(shí)刻只有一個(gè)成員存在10.1共用體類(lèi)型與共用體變量210.1.1共用體的概念

使幾個(gè)不同的變量共占同一段內(nèi)存的結(jié)構(gòu)稱(chēng)為“共用體”類(lèi)型的結(jié)構(gòu).定義共用體類(lèi)型變量的一般形式為:union

共用體名{

成員表列

}變量表列;圖11-2410.1共用體類(lèi)型與共用體變量uniondata{inti;charch;floatf;};3共同體類(lèi)型變量的定義(1)先定義共同體類(lèi)型,再定義共同體類(lèi)型變量

uniondata { charch; floatf; };

uniondataa,b,c;4共同體類(lèi)型變量的定義(2)在定義共用體類(lèi)型的同時(shí)定義共用體類(lèi)型變量

uniondata { inti; charch; floatf; }a,b,c;

5共同體類(lèi)型變量的定義(3)定義共用體類(lèi)型時(shí),省略共用體類(lèi)型名,同時(shí)定義共用體類(lèi)型變量

union { inti; charch; floatf; }a,b,c;6共用體和結(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)度。

例如:上面定義的“共用體”變量a、b、c各占4個(gè)字節(jié)(因?yàn)橐粋€(gè)實(shí)型變量占4個(gè)字節(jié)),而不是各占2+1+4=7個(gè)字節(jié)。

10.1共用體類(lèi)型與共用體變量710.2.1共用體變量的引用方式

只有先定義了共用體變量才能引用它,而且不能引用共用體變量,而只能引用共用體變量中的成員。例如:前面定義了a、b、c為共用體變量

a.i(引用共用體變量中的整型變量i)

a.ch(引用共用體變量中的字符變量ch)

a.f(引用共用體變量中的實(shí)型變量f)10.2共用體變量的引用810.2.2共用體類(lèi)型數(shù)據(jù)的特點(diǎn)(1)同一個(gè)內(nèi)存段可以用來(lái)存放幾種不同類(lèi)型的成員,但在每一瞬時(shí)只能存放其中一種,而不是同時(shí)存放幾種。(2)共用體變量中起作用的成員是最后一次存放的成員,在存入一個(gè)新的成員后原有的成員就失去作用。

(3)共用體變量的地址和它的各成員的地址都是同一地址。

10.2共用體變量的引用9(4)不能對(duì)共用體變量名賦值,也不能企圖引用變量名來(lái)得到一個(gè)值,又不能在定義共用體變量時(shí)對(duì)它初始化。(5)不能把共用體變量作為函數(shù)參數(shù),也不能使函數(shù)帶回共用體變量,但可以使用指向共用體變量的指針(6)共用體類(lèi)型可以出現(xiàn)在結(jié)構(gòu)體類(lèi)型定義中,也可以定義共用體數(shù)組。反之,結(jié)構(gòu)體也可以出現(xiàn)在共用體類(lèi)型定義中,數(shù)組也可以作為共用體的成員。10.2共用體變量的引用10例設(shè)有若干個(gè)人員的數(shù)據(jù),其中有學(xué)生和教師。學(xué)生的數(shù)據(jù)中包括:姓名、號(hào)碼、性別、職業(yè)、班級(jí)。教師的數(shù)據(jù)包括:姓名、號(hào)碼、性別、職業(yè)、職務(wù)??梢钥闯觯瑢W(xué)生和教師所包含的數(shù)據(jù)是不同的。現(xiàn)要求把它們放在同一表格中。圖11-2510.3共用體變量的應(yīng)用1110.3共用體變量的應(yīng)用12

#include<stdio.h>

struct

{

intnum;

charname[10];

charsex;

charjob;

union

{

intbanji;

charposition[10];

}category;

}person[2];/*先設(shè)人數(shù)為2*/10.3共用體變量的應(yīng)用13voidmain(){inti;for(i=0;i<2;i++){scanf("%d%s%c%c",&person[i].num,&person[i].name,&person[i].sex,&person[i].job);if(person[i].job=='S')scanf("%d",&person[i].category.banji);elseif(person[i].job=='T')scanf("%s",person[i].category.position);else

printf(“Inputerror!”);}

printf("\n");printf("Nsexjobclass/position\n");for(i=0;i<2;i++){if(person[i].job=='S')printf(“%-6d%-10s%-3c%-3c%-6d\n”,person[i].num,

person[i].name,person[i].sex,person[i].job,

person[i].category.banji);else

printf(“%-6d%-10s%-3c%-3c%-6s\n”,person[i].num,

person[i].name,person[i].sex,person[i].job,

person[i].category.position);}}運(yùn)行情況如下:101Lifs501WangmtprofessorNo.Namesexjobclass/position101Lifs501102Wangmtprofessor143.位運(yùn)算有:

“按位與”運(yùn)算“按位或”運(yùn)算“異或”運(yùn)算“取反”運(yùn)算左移運(yùn)算右移運(yùn)算

1.位運(yùn)算和指針一樣,都是C語(yǔ)言的重要特色。

2.位運(yùn)算的概念:

所謂位運(yùn)算,是指進(jìn)行二進(jìn)制位的運(yùn)算。例如:將一個(gè)存儲(chǔ)單元中的各二進(jìn)制位左移或右移1位,兩個(gè)數(shù)按位相加等。位運(yùn)算符含義舉例&按位與a&b|按位或a|b∧按位異或a∧b~按位取反~a<<左移a<<1>>右移b>>210.4位運(yùn)算與位段結(jié)構(gòu)15

4.位賦值運(yùn)算符

位賦值運(yùn)算符是位運(yùn)算符與賦值運(yùn)算符的結(jié)合。位賦值運(yùn)算符含義舉例等同于&=位與賦值a&=ba=a&b|=位或賦值a|=ba=a|b∧=位異或賦值a∧=ba=a∧b<<=左移賦值a<<=ba=a<<b>>=右移賦值a>>=ba=a>>b10.4位運(yùn)算與位段結(jié)構(gòu)1610.4位運(yùn)算與位段結(jié)構(gòu)程序:main(){intnum,bit,i;unsignedtest=0x8000;printf("inputmum:");scanf("%d",&num);printf("binaryof%xis:",num);for(i=1;i<=16;i++){bit=((num&test)==0)?0:1;printf("%d",bit);test>>=1;}}

運(yùn)行結(jié)果:inputnum:12345↙binaryof3039is:0011000000111001例

輸出一個(gè)整數(shù)的二進(jìn)制形式。

5.舉例17信息的存取一般以字節(jié)為單位。實(shí)際上,有時(shí)存儲(chǔ)一個(gè)信息不必用一個(gè)或多個(gè)字節(jié),例如,“真”或“假”用0或1表示,只需1位即可。在計(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)18可以人為地將一個(gè)整型變量data分為幾部分。但是用這種方法給一個(gè)字節(jié)中某幾位賦值太麻煩??梢晕欢谓Y(jié)構(gòu)體的方法。

怎樣向一個(gè)字節(jié)中的一個(gè)或幾個(gè)二進(jìn)制位賦值和改變它的值呢?可以用以下兩種方法:(2)位段

C語(yǔ)言允許在一個(gè)結(jié)構(gòu)體中以位為單位來(lái)指定其成員所占內(nèi)存長(zhǎng)度,這種以位為單位的成員稱(chēng)為“位段”或稱(chēng)“位域”(bitfield)。利用位段能夠用較少的位數(shù)存儲(chǔ)數(shù)據(jù)。19程序如下:structpacked-data{unsigneda:2;

unsignedb:6;

unsignedc:4;

unsignedd:4;

inti;}data;20(1)位段成員的類(lèi)型必須指定為unsigned或int類(lèi)型。(2)若某一位段要從另一個(gè)字開(kāi)始存放,可用以下形式定義:unsigneda:1;unsigned

b:2;一個(gè)存儲(chǔ)單元unsigned:0;unsignedc:3;另一存儲(chǔ)單元

a、b、c應(yīng)連續(xù)存放在一個(gè)存儲(chǔ)單元中,由于用了長(zhǎng)度為0的位段,其作用是使下一個(gè)位段從下一個(gè)存儲(chǔ)單元開(kāi)始存放。因此,只將a、b存儲(chǔ)在一個(gè)存儲(chǔ)單元中,c另存在下一個(gè)單元(“存儲(chǔ)單元”可能是一個(gè)字節(jié),也可能是2個(gè)字節(jié),視不同的編譯系統(tǒng)而異)。

關(guān)于位段的定義和引用的說(shuō)明:21(3)一個(gè)位段必須存儲(chǔ)在同一存儲(chǔ)單元中,不能跨兩個(gè)單元。如果第一個(gè)單元空間不能容納下一個(gè)位段,則該空間不用,而從下一個(gè)單元起存放該位段。(4)可以定義無(wú)名位段。(5)位段的長(zhǎng)度不能大于存儲(chǔ)單元的長(zhǎng)度,也不能定義位段數(shù)組。(6)位段可以用整型格式符輸出。(7)位段可以在數(shù)值表達(dá)式中引用,它會(huì)被系統(tǒng)自動(dòng)地轉(zhuǎn)換成整型數(shù)。關(guān)于位段的定義和引用的說(shuō)明:222.枚舉類(lèi)型和枚舉變量的定義:enumweekday{sun,mon,tue,wed,thu,fri,sat};

enumweekday

workday;10.5枚舉類(lèi)型

1.枚舉數(shù)據(jù)類(lèi)型的概念:

所謂“枚舉”是指將變量的所有取值一一列出,變量的值只在列舉出來(lái)的值的范圍內(nèi)。23說(shuō)明:在C編譯中,對(duì)枚舉元素按常量處理,故稱(chēng)枚舉常量。它們不是變量,不能對(duì)它們賦值。(2)枚舉元素作為常量,它們是有值的,C語(yǔ)言編譯按定義時(shí)的順序使它們的值為0,1,2…(3)枚舉值可以用來(lái)作判斷比較。(4)一個(gè)整數(shù)不能直接賦給一個(gè)枚舉變量。

10.5枚舉類(lèi)型24例11.13口袋中有紅、黃、藍(lán)、白、黑5種顏色的球若干個(gè)。每次從口袋中先后取出3個(gè)球,問(wèn)得到3種不同色的球的可能取法,輸出每種排列的情況。

算法:圖11-27,11-28

10.5枚舉類(lèi)型25#include<stdio.h>main(){enumcolor{red,yellow,blue,white,black};enumcolori,j,k,pri;intn,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) { case1:pri=i;break;

case2:pri=j;break;

case3:pri=k;break;

default:break;

}26switch(pri){

casered:printf("%-10s","red");break;

caseyellow:printf("%-10s","yellow");break;

caseblue:printf("%-10s","blue");break;

casewhite:printf("%-10s","white");break;

caseblack:printf("%-10s","black");break;

default:break;}}printf("\n");}}printf("\ntotal:%5d\n",n);}運(yùn)行情況如下:1redyellowblue2redyellowwhite3redyellowblack58blackwhitered59blackwhiteyellow60blackwhitebluetotal:60273.舉例例I定義基本類(lèi)型名為新類(lèi)型名。如:

typedef floatREAL;

則此后可以使用REAL代替floa。即:REALa,b;等價(jià)于floata,b;2.作用:用新類(lèi)型名代替已有類(lèi)型名。新類(lèi)型名為用戶(hù)標(biāo)識(shí)符。而已有類(lèi)型名可以是:基本數(shù)據(jù)類(lèi)型名、指針、結(jié)構(gòu)體、共用體、枚舉類(lèi)型。10.6

類(lèi)型定義(typedef語(yǔ)句)

1.

typedef語(yǔ)句的一般格式為:

typedef 已有類(lèi)型名

新類(lèi)型名;283.舉例例II將已經(jīng)定義的結(jié)構(gòu)體類(lèi)型的標(biāo)識(shí)符重新定義為新類(lèi)型名。如:structdata{intyear;intmonth;intday;};

typedefstructdataDATA;

則此后語(yǔ)句:DATAd;等價(jià)于structdatad;

10.6

類(lèi)型定義(typedef語(yǔ)句)293.舉例例III將結(jié)構(gòu)體類(lèi)型直接定義為新類(lèi)型名。如:typedefstructdata{intyear;intmonth;intday;}DATA;則可以使用新類(lèi)型名定義變量:DATAd;10.6

類(lèi)型定義(typedef語(yǔ)句)304.對(duì)typedef語(yǔ)句的說(shuō)明:①typedef只是為現(xiàn)有的類(lèi)型提供了一個(gè)易于使用、可識(shí)別的別名,它并沒(méi)有創(chuàng)建一種新的類(lèi)型。②typedef的作用域取決于typedef語(yǔ)句所在的位置。與變量作用域類(lèi)似。5.思考討論設(shè)有如下說(shuō)明

typedef

struct

ST

{longa;

int

b;

char

c[2];

}NEW;

則下面敘述中正確的是____________。

A)以上的說(shuō)明形式非法B)ST是一個(gè)結(jié)構(gòu)體類(lèi)型

C)NEW是一個(gè)結(jié)構(gòu)體類(lèi)型D)NEW是一個(gè)結(jié)構(gòu)體變量10.6

類(lèi)型定義(typedef語(yǔ)句)31用typedef定義類(lèi)型的方法

①先按定義變量的方法寫(xiě)出定義體(如:inti)。②將變量名換成新類(lèi)型名(例如:將i換成COUNT)。③在最前面加typedef(例如:t

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 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ì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論