版權(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度高新技術(shù)企業(yè)股權(quán)激勵(lì)分配協(xié)議書(shū)
- 2025年度綠色農(nóng)藥銷(xiāo)售代理協(xié)議范本
- 2025年度門(mén)衛(wèi)勞務(wù)承包與智能門(mén)禁系統(tǒng)協(xié)議3篇
- 2025年度企業(yè)研發(fā)團(tuán)隊(duì)博士研究員聘用協(xié)議3篇
- 2025年度木材運(yùn)輸安全責(zé)任與賠償合同范本
- 2025年度錨具招標(biāo)及合同范本操作手冊(cè)
- 2025年度礦產(chǎn)資源開(kāi)采合同補(bǔ)充協(xié)議3篇
- 2025年度影視節(jié)目主持人勞務(wù)合同范本
- 2025年度葡萄品種改良與種植技術(shù)合作合同4篇
- 2025年度農(nóng)業(yè)合作社種植技術(shù)合作協(xié)議書(shū)(十版)
- 2023年海南省公務(wù)員錄用考試《行測(cè)》真題卷及答案解析
- 橋梁監(jiān)測(cè)監(jiān)控實(shí)施方案
- 消防控制室值班人員崗位職責(zé)-五項(xiàng)制度
- 鋼結(jié)構(gòu)安裝施工培訓(xùn)
- 2024至2030年中國(guó)抗菌藥數(shù)據(jù)監(jiān)測(cè)研究報(bào)告
- 藝術(shù)哲學(xué):美是如何誕生的學(xué)習(xí)通超星期末考試答案章節(jié)答案2024年
- 太平洋保險(xiǎn)在線測(cè)評(píng)題
- 珠寶玉石居間合同范本
- 青少年人工智能編程水平測(cè)試二級(jí)-模擬真題01含答案
- 仁愛(ài)英語(yǔ)八年級(jí)下冊(cè)Unit-5-Topic-2單元測(cè)試
- DZ∕T 0291-2015 飾面石材礦產(chǎn)地質(zhì)勘查規(guī)范
評(píng)論
0/150
提交評(píng)論