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

下載本文檔

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

文檔簡介

1、9.4 9.4 共共 用用 體體 1共用型概念共用型概念 使幾個不同的變量占用同一段內(nèi)存空間的結(jié)構(gòu)稱為共使幾個不同的變量占用同一段內(nèi)存空間的結(jié)構(gòu)稱為共用型。用型。 2共用類型的定義共用類型的定義與結(jié)構(gòu)類型的定義類似與結(jié)構(gòu)類型的定義類似 union 共用類型名共用類型名 成員列表成員列表 ; 3共用變量的定義共用變量的定義與結(jié)構(gòu)變量的定義類似與結(jié)構(gòu)變量的定義類似 直接定義形式如下:直接定義形式如下: 間接定義形式如下:間接定義形式如下: union union 共用體名共用體名 union union 共用體名共用體名 分量表分量表 分量表分量表 ; 變量表變量表 ; union ; union

2、 共用體名共用體名 變量表變量表; ;共用變量的引用共用變量的引用與結(jié)構(gòu)變量一樣只能逐個引用共用變量的成員與結(jié)構(gòu)變量一樣只能逐個引用共用變量的成員 printf( “%d”, a); 錯誤錯誤 scanf( “%d”,&a); 錯誤錯誤訪問變量訪問變量 a 各成員的格式為:各成員的格式為:a. i、a.ch、a.f scanf( “d”,&a.i); printf( “%dn”,a.i);5.共用體與結(jié)構(gòu)體相似之處共用體與結(jié)構(gòu)體相似之處(1 1)都是由不同類型的數(shù)據(jù)項組成一個都是由不同類型的數(shù)據(jù)項組成一個(2 2)都只能對分量進行操作和引用。都只能對分量進行操作和引用。例例 1

3、: 對共用體變量的使用對共用體變量的使用struct int num; 編號編號 char name10; 姓名姓名 char sex; 性別性別 char job; 類別:類別:s 學(xué)生學(xué)生 t 教師教師 union int ciass; 班號班號 char position10; 職務(wù)職務(wù) category; per 2;構(gòu)造類型構(gòu)造類型( (數(shù)組、數(shù)組、結(jié)構(gòu)體、共用體結(jié)構(gòu)體、共用體) )的定義可以嵌套的定義可以嵌套 main() int n, i; for ( i=0;i2;i+) scanf(“%d%s%c%c”,&peri.num, , &peri.

4、sex,&peri.job); if ( peri.job= =s) scanf( “%d”,&peri.category.class); else if ( peri.job= =t) scanf( “%s”,peri.category.position); else printf( “input error!”); prints( “n”);6共用變量特點共用變量特點(1)系統(tǒng)采用覆蓋技術(shù),實現(xiàn)共用變量各成員的內(nèi)系統(tǒng)采用覆蓋技術(shù),實現(xiàn)共用變量各成員的內(nèi)存共享,所以在某一時刻,存放的和起作用的是最后一次存共享,所以在某一時刻,存放的和起作用的是最后一次存入的成員值。存入的成員

5、值。(2)由于所有成員共享同一內(nèi)存空間,故共用變量由于所有成員共享同一內(nèi)存空間,故共用變量與其各成員的地址相同。與其各成員的地址相同。 (3)不能對共用變量進行初始化(注意:結(jié)構(gòu)變量不能對共用變量進行初始化(注意:結(jié)構(gòu)變量可以);也不能將共用變量作為函數(shù)參數(shù),以及使函數(shù)返可以);也不能將共用變量作為函數(shù)參數(shù),以及使函數(shù)返回一個共用數(shù)據(jù),但可以使用指向共用變量的指針。回一個共用數(shù)據(jù),但可以使用指向共用變量的指針。(4)共用類型可以出現(xiàn)在結(jié)構(gòu)類型定義中,反之亦共用類型可以出現(xiàn)在結(jié)構(gòu)類型定義中,反之亦然。然。 struct memb float v;int n;char c; sa1; sa1占占7

6、個字個字 節(jié)內(nèi)存空間節(jié)內(nèi)存空間union memb float v;int n;char c; usa2; usa2占占4個字個字節(jié)節(jié)內(nèi)存空間內(nèi)存空間 100110051007vnc2001vnc200220032004 共用變量占用的內(nèi)存空間,等于最長成員的長度,而共用變量占用的內(nèi)存空間,等于最長成員的長度,而不是各成員長度之和。不是各成員長度之和。 7、共用體與結(jié)構(gòu)體的主要區(qū)別共用體與結(jié)構(gòu)體的主要區(qū)別 (1 1)結(jié)構(gòu)體變量結(jié)構(gòu)體變量 占用空間是各成員所占空間之總和占用空間是各成員所占空間之總和; ; 共用體變量共用體變量 占存儲空間是各成員中所占空間最大者。占存儲空間是各成員中所占空間最大

7、者。 (2 2)結(jié)構(gòu)體變量結(jié)構(gòu)體變量 各成員占用內(nèi)存中一片連續(xù)的存儲區(qū),各成員占用內(nèi)存中一片連續(xù)的存儲區(qū),各成員的地址互不相同;各成員的地址互不相同;共用體變量共用體變量各成員在內(nèi)存中所占各成員在內(nèi)存中所占空間的起始地址相同。空間的起始地址相同。 (3 3)結(jié)構(gòu)體變量結(jié)構(gòu)體變量的各個分量在任何時刻都同時存在,的各個分量在任何時刻都同時存在,且可同時引用。且可同時引用。共用體變量共用體變量的各個分量在同一時刻只存在的各個分量在同一時刻只存在其中一個,也只能引用其中的一個其中一個,也只能引用其中的一個。 (4 4)結(jié)構(gòu)體變量結(jié)構(gòu)體變量可以初始化可以初始化,共用體變量共用體變量不能初始化。不能初始化

8、。例例2: 共用體的內(nèi)存使用。共用體的內(nèi)存使用。#include void main() union int i; char string2; a; a.i=24897;printf(“i=%d,string1=%c”,a.i,a.string0); printf(“string2=%cn”, a.string1);string0=0; string1=0;printf(“i=%d,string1=%c”,a.i,a.string0); printf(“string2=%cn”, a.string1);程序運行結(jié)果程序運行結(jié)果: i=24897,string1=A,string2=ai=822

9、4,string1=0,string2=0例例3: 將共用體變量作為函數(shù)的參數(shù)。將共用體變量作為函數(shù)的參數(shù)。#include union testint i;char string2; a;void show(union test a) printf(“i=%d,string1=%c”,a.i,a.string0); printf(“string2=%cn”, a.string1); return; void main() a.i=24897; show(a);string0=0; string1=0;show(a); return;程序運行結(jié)果:程序運行結(jié)果:I=24897,string1=

10、A,string2=aI=8224,string1=0,string2=01定義格式:定義格式: enum 枚舉類型名枚舉類型名 取值表取值表;例如,例如, enum weekdays Sun,Mon,Tue,Wed,Thu,Fri,Sat; 中的標識符稱為枚舉常量。中的標識符稱為枚舉常量。它只能為標識符,不能為數(shù)字常量或字符常量它只能為標識符,不能為數(shù)字常量或字符常量2枚舉變量的定義(與結(jié)構(gòu)體變量類似)枚舉變量的定義(與結(jié)構(gòu)體變量類似)(1)間接定義)間接定義例如,例如,enum weekdays w1,w2;(2)直接定義)直接定義例如,例如, enum weekdays Sun,Mon,

11、Tue,Wed,Thu,Fri,Sat w1,w2 ; 9.5 9.5 枚枚 舉舉 類類 型型3枚舉型使用說明枚舉型使用說明(1)枚舉型僅適應(yīng)于取值有限的數(shù)據(jù)。枚舉型僅適應(yīng)于取值有限的數(shù)據(jù)。 例如例如: 周天周天, 年個月。年個月。(2)取值表中的值為枚舉元素,其含義由程序解取值表中的值為枚舉元素,其含義由程序解釋。釋。 例如,不是寫成例如,不是寫成“Sun”就自動代表就自動代表“星期天星期天”。事實上,事實上, 枚舉元素用什么表示都可以。枚舉元素用什么表示都可以。(3)枚舉型變量枚舉型變量 w1 , w2 只能在定義的值表中取只能在定義的值表中取其中一個枚舉常量作為當(dāng)前值。其中一個枚舉常量作

12、為當(dāng)前值。(4)枚舉元素作為常量是有值的。枚舉元素作為常量是有值的。 定義時定義時順序號,從開始順序號,從開始,所以枚舉元素可以進行,所以枚舉元素可以進行比較,比較規(guī)則是:序號大者為大!比較,比較規(guī)則是:序號大者為大!例如,上例中的例如,上例中的Sun=0、Mon=1、Sat=6,所以所以 MonSun、 Sat 最大。最大。(5)枚舉元素的值也是可以改變的。枚舉元素的值也是可以改變的。在定義時由程序指定,例如在定義時由程序指定,例如:enum weekdays Sun=7, Mon1 ,Tue, Wed, Thu, Fri, Sat;則則Sun=7,Mon=1,從,從Tue=2開始,依次增。

13、開始,依次增。(6)一個整型數(shù)值不能直接賦值給一個枚舉變量。一個整型數(shù)值不能直接賦值給一個枚舉變量。 enum weekdays Sun= 7, Mon 1 ,Tue, Wed, Thu, Fri, Sat; enum weekdays wk1;不允許直接賦值整數(shù):不允許直接賦值整數(shù):wk1 = 7; /*數(shù)據(jù)類型不同數(shù)據(jù)類型不同*/只能寫成:只能寫成: wk1= Sun; 或:或: wk1=( enum weekdays )7;甚至可以是表達式,如:甚至可以是表達式,如: w2=(enum weekday)(5-3); 例例 4: 枚舉類型的用法枚舉類型的用法 #include enum m

14、onths JAN=1,FEB,MAR,APR,MAY, JUN,JUL,AUG,SEP,OCT,NOV,DEC ;main() enum months month; char *mname=,January,February, March,April,May,June,July, Auguest, September, October,November,Dcember; for(month=JAN;month=DEC;month+) printf(%2d - %-10sn,month, mnamemonth); 9.6 typedef 9.6 typedef 類型定義類型定義 除可直接使用提

15、供的標準類型和自定義的類型除可直接使用提供的標準類型和自定義的類型(結(jié)構(gòu)、共用、枚舉)外,也可使用(結(jié)構(gòu)、共用、枚舉)外,也可使用typedeftypedef定義已有類定義已有類型的別名。該別名與標準類型名一樣,可用來定義相應(yīng)型的別名。該別名與標準類型名一樣,可用來定義相應(yīng)的變量的變量。 ()()簡單的名字替換簡單的名字替換typedef char CHARACTER;經(jīng)過上面的定義后經(jīng)過上面的定義后CHARACTER就與數(shù)據(jù)類型就與數(shù)據(jù)類型char等等價,同樣也可以用價,同樣也可以用CHARACTER來定義字符型變量。例來定義字符型變量。例如:如:typedef char CHARACTER

16、;char a;CHARACTER b;變量變量a,b都是字符型。都是字符型。()()定義一個類型名代表一個結(jié)構(gòu)體類型。例如;定義一個類型名代表一個結(jié)構(gòu)體類型。例如;typedef struct char number9; char name8; char department50; STUDENT; STUDENT stud1,stud2; 上面定義的變量上面定義的變量stud1stud1和和stude2stude2都屬于結(jié)構(gòu)體變量,都屬于結(jié)構(gòu)體變量,這樣就簡單化了結(jié)構(gòu)體變量的聲明。這樣就簡單化了結(jié)構(gòu)體變量的聲明。 typedef int *zzbl; zzbl p, a6; 等價于等價于

17、int *p, *a6; /*p是整型指針變量,是整型指針變量,a是整型指針數(shù)組是整型指針數(shù)組*/說明:說明: (1)用用typedef只是給已有類型增加個別名,并只是給已有類型增加個別名,并不能創(chuàng)造個新的類型。不能創(chuàng)造個新的類型。 (2)typedef與與#define有有相似之處,但二者是不同相似之處,但二者是不同的:前者是由編譯器在編譯時處理的;后者是由編譯的:前者是由編譯器在編譯時處理的;后者是由編譯預(yù)處理器在編譯預(yù)處理時處理的,而且只能作簡單的預(yù)處理器在編譯預(yù)處理時處理的,而且只能作簡單的字符串替換。字符串替換。9.7 9.7 位運算位運算 1、位邏輯運算符、位邏輯運算符 按位取反按

18、位取反(與與!同級同級) 單目右結(jié)合單目右結(jié)合 & 按位與按位與 按位異或按位異或 相同取相同取0,不同取,不同取1 | 按位或按位或1、位邏輯運算符 按位取反按位取反 & 按位與按位與 按位異或按位異或 相同取相同取0,不同取,不同取1 | 按位或按位或 x=0 00000000 00000000 y=3 00000000 00000011x&y 00000000 00000000 x|y 00000000 00000011xy 00000000 000000111010 0101 =1111 注意區(qū)分:注意區(qū)分: &和和| &和和| x & y得得 0 x | y得得 12、位移位運算符 對操作數(shù)右移給出的位數(shù)對操作數(shù)右移給出的位數(shù) x3 將將x向左移向左移3位,空出的位用零填補位,空出的位用零填補 00111010 3 將將x向右移向右移3位位 00111010 3 000001113、復(fù)合位賦值運算符 &= |= = = = 例:例:a&=b 相當(dāng)于相當(dāng)于 a=a&b a=2 相當(dāng)于相當(dāng)于 a=a29.8 9.8 宏定義宏定義# define 宏名標識符 宏定

溫馨提示

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

最新文檔

評論

0/150

提交評論