第4章4━━結(jié)構(gòu)體、枚舉類型_第1頁
第4章4━━結(jié)構(gòu)體、枚舉類型_第2頁
第4章4━━結(jié)構(gòu)體、枚舉類型_第3頁
第4章4━━結(jié)構(gòu)體、枚舉類型_第4頁
第4章4━━結(jié)構(gòu)體、枚舉類型_第5頁
已閱讀5頁,還剩25頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、C+C+ 第第4 4章章(4)(4) 結(jié)構(gòu)體、枚舉類型結(jié)構(gòu)體、枚舉類型 1第章結(jié)構(gòu)體、枚舉類型 2 主要內(nèi)容主要內(nèi)容 l 結(jié)構(gòu)體類型的定義結(jié)構(gòu)體類型的定義 l 結(jié)構(gòu)體變量的定義結(jié)構(gòu)體變量的定義 l 結(jié)構(gòu)體變量的使用結(jié)構(gòu)體變量的使用 l 結(jié)構(gòu)體數(shù)組結(jié)構(gòu)體數(shù)組 l 結(jié)構(gòu)體中的靜態(tài)成員結(jié)構(gòu)體中的靜態(tài)成員 l 位域(選讀)位域(選讀) l 共同體(選讀)共同體(選讀) l 枚舉類型的定義枚舉類型的定義 l 枚舉變量的定義和使用枚舉變量的定義和使用 3 結(jié)構(gòu)體類型的定義結(jié)構(gòu)體類型的定義 l 結(jié)構(gòu)體屬于構(gòu)造數(shù)據(jù)類型結(jié)構(gòu)體屬于構(gòu)造數(shù)據(jù)類型 : 數(shù)組是一組相同類型數(shù)據(jù)組成的集合體;結(jié)構(gòu)體是若干個(gè)不同類型數(shù)據(jù)組

2、成的集合數(shù)組是一組相同類型數(shù)據(jù)組成的集合體;結(jié)構(gòu)體是若干個(gè)不同類型數(shù)據(jù)組成的集合 體。結(jié)構(gòu)體彌補(bǔ)了數(shù)組的不足,使得一個(gè)結(jié)構(gòu)體數(shù)據(jù)可以包含多種類型的數(shù)據(jù)項(xiàng)。體。結(jié)構(gòu)體彌補(bǔ)了數(shù)組的不足,使得一個(gè)結(jié)構(gòu)體數(shù)據(jù)可以包含多種類型的數(shù)據(jù)項(xiàng)。 一個(gè)結(jié)構(gòu)體類型由若干個(gè)不同類型的成員數(shù)據(jù)項(xiàng)組成,用一個(gè)類型名來命名,這樣一個(gè)結(jié)構(gòu)體類型由若干個(gè)不同類型的成員數(shù)據(jù)項(xiàng)組成,用一個(gè)類型名來命名,這樣 就可將這些不同類型的成員數(shù)據(jù)項(xiàng)作為一個(gè)整體來處理。就可將這些不同類型的成員數(shù)據(jù)項(xiàng)作為一個(gè)整體來處理。 【例】描述學(xué)生的數(shù)據(jù)項(xiàng)有:學(xué)號、姓名、性別、成績,可將這些不同類型的數(shù)據(jù)項(xiàng)【例】描述學(xué)生的數(shù)據(jù)項(xiàng)有:學(xué)號、姓名、性別、成績,

3、可將這些不同類型的數(shù)據(jù)項(xiàng) 作為一個(gè)整體來處理,定義一個(gè)名為作為一個(gè)整體來處理,定義一個(gè)名為 student 的數(shù)據(jù)類型,包括的數(shù)據(jù)類型,包括 id、name、 sex、score 四個(gè)成員數(shù)據(jù)項(xiàng),那么四個(gè)成員數(shù)據(jù)項(xiàng),那么 student 就是一個(gè)結(jié)構(gòu)體類型。就是一個(gè)結(jié)構(gòu)體類型。 struct student int id ; char name 10 ; char sex ; float score ; ; 4 結(jié)構(gòu)體類型的定義結(jié)構(gòu)體類型的定義 l 結(jié)構(gòu)體類型的定義結(jié)構(gòu)體類型的定義 : struct 結(jié)構(gòu)體類型名結(jié)構(gòu)體類型名 類型類型 成員名成員名1 ; 類型類型 成員名成員名2 ; 類型類型

4、 成員名成員名 n ; ; /此處分號不可缺少此處分號不可缺少 l 幾點(diǎn)說明:幾點(diǎn)說明: 結(jié)構(gòu)體類型名結(jié)構(gòu)體類型名按標(biāo)識符命名規(guī)則命名。注意:結(jié)構(gòu)體類型是一種構(gòu)造的數(shù)據(jù)類按標(biāo)識符命名規(guī)則命名。注意:結(jié)構(gòu)體類型是一種構(gòu)造的數(shù)據(jù)類 型,定義一個(gè)結(jié)構(gòu)體類型,就是定義該結(jié)構(gòu)體中成員的結(jié)構(gòu)框架,編譯系統(tǒng)不為任型,定義一個(gè)結(jié)構(gòu)體類型,就是定義該結(jié)構(gòu)體中成員的結(jié)構(gòu)框架,編譯系統(tǒng)不為任 何數(shù)據(jù)類型分配存儲空間,當(dāng)然也不為結(jié)構(gòu)體類型分配存儲空間!何數(shù)據(jù)類型分配存儲空間,當(dāng)然也不為結(jié)構(gòu)體類型分配存儲空間! 結(jié)構(gòu)體成員結(jié)構(gòu)體成員花括號中依次列出組成該結(jié)構(gòu)體類型的各個(gè)成員,并對各成員進(jìn)行花括號中依次列出組成該結(jié)構(gòu)體類

5、型的各個(gè)成員,并對各成員進(jìn)行 類型聲明,成員的類型可以是類型聲明,成員的類型可以是C+中任意基本數(shù)據(jù)類型,也可以是已定義的構(gòu)造數(shù)中任意基本數(shù)據(jù)類型,也可以是已定義的構(gòu)造數(shù) 據(jù)類型。注意:聲明成員時(shí),不能指定其存儲類型為:據(jù)類型。注意:聲明成員時(shí),不能指定其存儲類型為: auto、register、extern , 因?yàn)橄到y(tǒng)并不為結(jié)構(gòu)體類型分配存儲空間,但可以指定成員的存儲類型為因?yàn)橄到y(tǒng)并不為結(jié)構(gòu)體類型分配存儲空間,但可以指定成員的存儲類型為 static , 關(guān)于結(jié)構(gòu)體中關(guān)于結(jié)構(gòu)體中 static 靜態(tài)成員的作用本章后續(xù)介紹。靜態(tài)成員的作用本章后續(xù)介紹。 5 結(jié)構(gòu)體變量的定義結(jié)構(gòu)體變量的定義

6、l 結(jié)構(gòu)體變量的定義結(jié)構(gòu)體變量的定義 : 格式格式1: 存儲類型存儲類型 結(jié)構(gòu)體類型名結(jié)構(gòu)體類型名 變量名變量名1 ,變量名,變量名2 ; 格式格式2: 存儲類型存儲類型 struct 結(jié)構(gòu)體類型名結(jié)構(gòu)體類型名 變量名變量名1 ,變量名,變量名2 ; l 幾點(diǎn)說明:幾點(diǎn)說明: 存儲類型有存儲類型有 auto、static、register、extern 四種。當(dāng)存儲類型省略時(shí),對于局部四種。當(dāng)存儲類型省略時(shí),對于局部 結(jié)構(gòu)體變量,表示結(jié)構(gòu)體變量,表示auto。 定義結(jié)構(gòu)體變量時(shí),系統(tǒng)按結(jié)構(gòu)體類型中的成員框架為其分配一段連續(xù)的存儲空間,定義結(jié)構(gòu)體變量時(shí),系統(tǒng)按結(jié)構(gòu)體類型中的成員框架為其分配一段連

7、續(xù)的存儲空間, 依次存放各個(gè)成員的數(shù)據(jù),所占內(nèi)存的字節(jié)數(shù)為各個(gè)成員所占字節(jié)數(shù)之和。依次存放各個(gè)成員的數(shù)據(jù),所占內(nèi)存的字節(jié)數(shù)為各個(gè)成員所占字節(jié)數(shù)之和。 結(jié)構(gòu)體變量的作用域與一般變量的作用域相同,全局結(jié)構(gòu)體變量具有文件作用域,結(jié)構(gòu)體變量的作用域與一般變量的作用域相同,全局結(jié)構(gòu)體變量具有文件作用域, 局部結(jié)構(gòu)體變量具有塊作用域。局部結(jié)構(gòu)體變量具有塊作用域。 結(jié)構(gòu)體變量的生存期也與一般變量的生存期相同,結(jié)構(gòu)體變量的生存期也與一般變量的生存期相同,全局結(jié)構(gòu)體變量、全局結(jié)構(gòu)體變量、static靜態(tài)局部靜態(tài)局部 結(jié)構(gòu)體變量存放在靜態(tài)區(qū),結(jié)構(gòu)體變量存放在靜態(tài)區(qū),auto局部結(jié)構(gòu)體變量存放在棧區(qū)。局部結(jié)構(gòu)體變量

8、存放在棧區(qū)。 6 結(jié)構(gòu)體變量的定義結(jié)構(gòu)體變量的定義 定義結(jié)構(gòu)體變量的方法有三種:定義結(jié)構(gòu)體變量的方法有三種: 先定義結(jié)構(gòu)體類型,再定義結(jié)構(gòu)體類型的變量。先定義結(jié)構(gòu)體類型,再定義結(jié)構(gòu)體類型的變量。 定義結(jié)構(gòu)體類型的同時(shí),緊跟著定義結(jié)構(gòu)體類型的變量。定義結(jié)構(gòu)體類型的同時(shí),緊跟著定義結(jié)構(gòu)體類型的變量。 定義無名的結(jié)構(gòu)體類型,并同時(shí)定義結(jié)構(gòu)體類型的變量。定義無名的結(jié)構(gòu)體類型,并同時(shí)定義結(jié)構(gòu)體類型的變量。 【例】【例】 #include struct person int id ; char name 10 ; ; struct date int year ; int month ; int day ;

9、 d1 ; /定義結(jié)構(gòu)體類型的同時(shí),緊跟著定義其變量。定義結(jié)構(gòu)體類型的同時(shí),緊跟著定義其變量。 struct int hour ; /無名結(jié)構(gòu)體類型無名結(jié)構(gòu)體類型 int minute ; int second ; t1 , t2 ; /定義無名結(jié)構(gòu)體類型,并同時(shí)定義其變量。定義無名結(jié)構(gòu)體類型,并同時(shí)定義其變量。 person p1 , p2 ; /先定義結(jié)構(gòu)體類型,再定義結(jié)構(gòu)體變量。先定義結(jié)構(gòu)體類型,再定義結(jié)構(gòu)體變量。 7 結(jié)構(gòu)體變量的使用結(jié)構(gòu)體變量的使用 l 結(jié)構(gòu)體變量的初始化:與數(shù)組類同,在定義結(jié)構(gòu)體變量時(shí),用花括號將每一個(gè)成員結(jié)構(gòu)體變量的初始化:與數(shù)組類同,在定義結(jié)構(gòu)體變量時(shí),用花括號

10、將每一個(gè)成員 的初值括起來賦給該變量。注意,花括號中列出初值其類型和順序必須與結(jié)構(gòu)體類的初值括起來賦給該變量。注意,花括號中列出初值其類型和順序必須與結(jié)構(gòu)體類 型定義中所聲明的成員一一對應(yīng)。型定義中所聲明的成員一一對應(yīng)。 【例】【例】 student s1 = 408001 , “張小笑張小笑” , F , 98 ; l 結(jié)構(gòu)體變量成員的引用:(使用成員運(yùn)算符結(jié)構(gòu)體變量成員的引用:(使用成員運(yùn)算符 “.” ) 結(jié)構(gòu)體變量名結(jié)構(gòu)體變量名 . 成員名成員名 l 幾點(diǎn)說明:幾點(diǎn)說明: 同類型的結(jié)構(gòu)體變量之間可以相互賦值,這種賦值等同于各個(gè)成員的依次賦值。同類型的結(jié)構(gòu)體變量之間可以相互賦值,這種賦值等

11、同于各個(gè)成員的依次賦值。 結(jié)構(gòu)體變量不能直接進(jìn)行輸入結(jié)構(gòu)體變量不能直接進(jìn)行輸入/輸出,它的每一個(gè)成員能否直接進(jìn)行輸入輸出,它的每一個(gè)成員能否直接進(jìn)行輸入/輸出,取決輸出,取決 于其成員的類型,若是基本數(shù)據(jù)類型或字符數(shù)組,則可以直接進(jìn)行輸入于其成員的類型,若是基本數(shù)據(jù)類型或字符數(shù)組,則可以直接進(jìn)行輸入/輸出。輸出。 8 【例】【例】 #include #include struct student int id ; char name 10 ; char sex ; float score ; ; void main ( ) student s1 = 408001 , “張小笑張小笑” , m

12、, 98 ; cout “s1=” s1.id t t s1.sex t s1.score endl; student s2 , s3 ; cout s2.id s2.sex s2.score ; cout “s2=” s2.id t t s2.sex t s2.score endl; s3 = s2 ; cout “s3=” s3.id t t s3.sex t s3.score endl; s3.id = 408003 ; strcpy( , “王嘻嘻王嘻嘻” ) ; cout “s3=” s3.id t s3

13、.name t s3.sex t s3.score endl; 運(yùn)行:運(yùn)行: s1= 408001 張小笑張小笑 m 98 請輸入學(xué)號請輸入學(xué)號 、姓名、姓名 、性別、性別( m / f ) 、成績、成績 : 408002 王哈哈王哈哈 f 88 s2= 408002 王哈哈王哈哈 f 88 s3= 408002 王哈哈王哈哈 f 88 s3= 408003 王嘻嘻王嘻嘻 f 88 9 結(jié)構(gòu)體變量的使用結(jié)構(gòu)體變量的使用 結(jié)構(gòu)體中成員的類型可以是結(jié)構(gòu)體中成員的類型可以是C+中任意基本數(shù)據(jù)類型,也可以是已定義的構(gòu)造數(shù)據(jù)類中任意基本數(shù)據(jù)類型,也可以是已定義的構(gòu)造數(shù)據(jù)類 型,因此當(dāng)然可以是已定義的結(jié)構(gòu)

14、體類型,當(dāng)要訪問嵌套在內(nèi)層的結(jié)構(gòu)體成員時(shí),型,因此當(dāng)然可以是已定義的結(jié)構(gòu)體類型,當(dāng)要訪問嵌套在內(nèi)層的結(jié)構(gòu)體成員時(shí), 同樣使用成員運(yùn)算符同樣使用成員運(yùn)算符 “.” 來實(shí)現(xiàn)。來實(shí)現(xiàn)。 【例】【例】 #include struct date int year ; int month ; int day ; ; struct student int id ; char name 10 ; char sex ; date birthday ; float score ; ; void main ( ) student s = 408001 , “張小笑張小笑” , m , 1991 , 5 , 15 ,

15、 98 ; cout s.id t t s.sex t s.birthday.year t ; cout s.birthday.month t s.birthday.day t s.score endl ; 運(yùn)行:運(yùn)行: 408001 張小笑張小笑 m 1991 5 15 98 id name sex birthday score year month day student 10 結(jié)構(gòu)體變量的使用結(jié)構(gòu)體變量的使用 結(jié)構(gòu)體變量與一般變量一樣,可以作為函數(shù)的參數(shù),同樣結(jié)構(gòu)體類型也可以作為函結(jié)構(gòu)體變量與一般變量一樣,可以作為函數(shù)的參數(shù),同樣結(jié)構(gòu)體類型也可以作為函 數(shù)返回值的類型。數(shù)返

16、回值的類型。 【例】【例】 #include struct complex float real , image ; ; /定義一個(gè)表示復(fù)數(shù)的結(jié)構(gòu)體類型定義一個(gè)表示復(fù)數(shù)的結(jié)構(gòu)體類型 void swap1 ( complex c1 , complex c2 ) complex t ; t = c1 ; c1 = c2 ; c2 = t ; void swap2 ( complex t = c1 ; c1 = c2 ; c2 = t ; complex add ( complex c1 , complex c2 ) /兩個(gè)復(fù)數(shù)相加,返回的和也是復(fù)數(shù)兩個(gè)復(fù)數(shù)相加,返回的和也是復(fù)數(shù) complex t

17、 ; t.real = c1.real + c2.real ; t.image = c1.image + c2.image ; return t ; 11 void main ( ) complex c1 = 5 , 7 , c2 = 3 , 2 , c3 ; cout “c1 = ( ” c1.real “ , ” c1.image “i ) n” ; cout “c2 = ( ” c2.real “ , ” c2.image “i ) nn” ; swap1( c1 , c2 ) ; cout “c1 = ( ” c1.real “ , ” c1.image “i ) n” ; cout

18、“c2 = ( ” c2.real “ , ” c2.image “i ) nn” ; swap2( c1 , c2 ) ; cout “c1 = ( ” c1.real “ , ” c1.image “i ) n” ; cout “c2 = ( ” c2.real “ , ” c2.image “i ) nn” ; c3 = add( c1 , c2 ) ; cout “c3 = ( ” c3.real “ , ” c3.image “i ) n” ; 運(yùn)行:運(yùn)行: c1 = ( 5 , 7i ) c2 = ( 3 , 2i ) c1 = ( 5 , 7i ) c2 = ( 3 , 2i )

19、 c1 = ( 3 , 2i ) c2 = ( 5 , 7i ) c3 = ( 8 , 9i ) 12 結(jié)構(gòu)體數(shù)組結(jié)構(gòu)體數(shù)組 l 結(jié)構(gòu)體數(shù)組:數(shù)組是一組相同類型的元素組成的集合體,結(jié)構(gòu)體數(shù)組:數(shù)組是一組相同類型的元素組成的集合體, 而數(shù)組元素的類型當(dāng)然可而數(shù)組元素的類型當(dāng)然可 以是已定義的結(jié)構(gòu)體類型,這種由結(jié)構(gòu)體變量組成的數(shù)組稱為結(jié)構(gòu)體數(shù)組。以是已定義的結(jié)構(gòu)體類型,這種由結(jié)構(gòu)體變量組成的數(shù)組稱為結(jié)構(gòu)體數(shù)組。 【例】(結(jié)構(gòu)數(shù)組)【例】(結(jié)構(gòu)數(shù)組) #include struct student int id ; char name 10 ; char sex 4 ; float score ;

20、; void input ( student void output ( student cout “t性別性別=” s.sex “t成績成績=” s.score endl ; 13 void sort ( student s , int n ) int i , j ; student t ; for ( i=0 ; in-1 ; i+ ) for ( j=i+1 ; jn ; j+ ) if ( s i .score s j .score ) t = s i ; s i = s j ; s j = t ; void main ( ) int i ; student s 4 ; for ( i

21、=0 ; i4 ; i+ ) input( s i ) ; cout “排序前:排序前:n” ; for ( i=0 ; i4 ; i+ ) output( s i ) ; sort( s , 4 ) ; cout “排序后:排序后:n” ; for ( i=0 ; i4 ; i+ ) output( s i ) ; 運(yùn)行:運(yùn)行: 請輸入學(xué)號、姓名、性別、成績請輸入學(xué)號、姓名、性別、成績 : 408001 王哈哈王哈哈 男男 65 請輸入學(xué)號、姓名、性別、成績請輸入學(xué)號、姓名、性別、成績 : 408002 李依依李依依 女女 97 請輸入學(xué)號、姓名、性別、成績請輸入學(xué)號、姓名、性別、成績 :

22、408003 張曉曉張曉曉 男男 71 請輸入學(xué)號、姓名、性別、成績請輸入學(xué)號、姓名、性別、成績 : 408004 孟虎虎孟虎虎 女女 83 排序前排序前 : 學(xué)號學(xué)號=408001 姓名姓名=王哈哈王哈哈 性別性別=男男 成績成績=65 學(xué)號學(xué)號=408002 姓名姓名=李依依李依依 性別性別=女女 成績成績=97 學(xué)號學(xué)號=408003 姓名姓名=張曉曉張曉曉 性別性別=男男 成績成績=71 學(xué)號學(xué)號=408004 姓名姓名=孟虎虎孟虎虎 性別性別=女女 成績成績=83 排序后排序后 : 學(xué)號學(xué)號=408002 姓名姓名=李依依李依依 性別性別=女女 成績成績=97 學(xué)號學(xué)號=408004

23、 姓名姓名=孟虎虎孟虎虎 性別性別=女女 成績成績=83 學(xué)號學(xué)號=408003 姓名姓名=張曉曉張曉曉 性別性別=男男 成績成績=71 學(xué)號學(xué)號=408001 姓名姓名=王哈哈王哈哈 性別性別=男男 成績成績=65 14 【例】(有三位侯選人,輸入各張選票上得票人的名字,統(tǒng)計(jì)出各人的得票數(shù)。【例】(有三位侯選人,輸入各張選票上得票人的名字,統(tǒng)計(jì)出各人的得票數(shù)。 ) #include #include struct person char name 10 ; int count ; ; void main ( ) int i ; char name 10 ; person leader 3 =

24、 “王哈哈王哈哈” , 0 , “肖嘻嘻肖嘻嘻” , 0 , “樂咪咪樂咪咪” , 0 ; cout name ; while ( strcmp( name , “0” ) != 0 ) for ( i=0 ; i name ; cout “統(tǒng)計(jì)結(jié)果:統(tǒng)計(jì)結(jié)果:n” ; for ( i=0 ; i3 ; i+ ) cout leader i .name “ = ” leader i .count “tt” ; cout 結(jié)構(gòu)體指針結(jié)構(gòu)體指針 - 成員名成員名 格式格式2:通過點(diǎn)成員運(yùn)算符:通過點(diǎn)成員運(yùn)算符 . (*結(jié)構(gòu)體指針)結(jié)構(gòu)體指針). 成員名成員名 17 【例】【例】 #include

25、struct student int id ; char name 10 ; float score ; ; void main ( ) student s = 408001 , “張小笑張小笑” , 98 ; student *p = cout “s=” s.id t t s.score endl ; cout “s=” (*p). id t (*p). name t (*p). score endl ; cout “s=” id t name t score endl ; 運(yùn)行:運(yùn)行: s = 408001 張小笑張小笑 98 s = 408001 張小笑張小笑 98 s =

26、 408001 張小笑張小笑 98 408001 張小笑張小笑 98 id name score s p 18 【例】(結(jié)構(gòu)體中的【例】(結(jié)構(gòu)體中的static靜態(tài)成員)靜態(tài)成員) #include struct student int id ; char name 10 ; char sex 4 ; float score ; static int count ; /靜態(tài)成員,引用性聲明靜態(tài)成員,引用性聲明 ; int student : count = 3 ; /靜態(tài)成員,定義性聲明靜態(tài)成員,定義性聲明 void main ( ) student s1 , s2 ; cout “s1:”

27、s1.count endl ; cout “s2:” s2.count endl ; s2.count = 6 ; cout “s1:” s1.count endl ; cout “s2:” s2.count endl ; 運(yùn)行:運(yùn)行: 3 6 6 19 位域(選讀)位域(選讀) l 位域:位域: 位域:指在一個(gè)字或字節(jié)中,用若干個(gè)二進(jìn)制位來建立若干個(gè)標(biāo)志位(一個(gè)標(biāo)志用位域:指在一個(gè)字或字節(jié)中,用若干個(gè)二進(jìn)制位來建立若干個(gè)標(biāo)志位(一個(gè)標(biāo)志用0 或或1來表示),具體作法是將一個(gè)字或一個(gè)字節(jié)根據(jù)需要?jiǎng)澐殖扇舾蓚€(gè)位域。來表示),具體作法是將一個(gè)字或一個(gè)字節(jié)根據(jù)需要?jiǎng)澐殖扇舾蓚€(gè)位域。 位域的定義:就是

28、定義一個(gè)結(jié)構(gòu)體類型,在結(jié)構(gòu)體類型中指定每一個(gè)成員占用的二位域的定義:就是定義一個(gè)結(jié)構(gòu)體類型,在結(jié)構(gòu)體類型中指定每一個(gè)成員占用的二 進(jìn)制位數(shù),即位域。進(jìn)制位數(shù),即位域。 一個(gè)位域成員的長度不能大于一個(gè)字的長度。一個(gè)位域成員的長度不能大于一個(gè)字的長度。 l 位域類型的定義位域類型的定義 : struct 結(jié)構(gòu)體類型名結(jié)構(gòu)體類型名 unsigned 位域名位域名1 : 二進(jìn)制位數(shù)二進(jìn)制位數(shù) ; unsigned 位域名位域名2 : 二進(jìn)制位數(shù)二進(jìn)制位數(shù) ; unsigned 位域名位域名n : 二進(jìn)制位數(shù)二進(jìn)制位數(shù) ; ; /此處分號不可缺少此處分號不可缺少 20 位域(選讀)位域(選讀) l 幾點(diǎn)

29、說明:幾點(diǎn)說明: 位域名按標(biāo)識符命名規(guī)則命名。位域名按標(biāo)識符命名規(guī)則命名。 位域的成員類型必須是無符號整型。位域的成員類型必須是無符號整型。 一個(gè)結(jié)構(gòu)體類型中定義的任何一個(gè)位域都必須在同一個(gè)字中,若本字中剩余的二進(jìn)一個(gè)結(jié)構(gòu)體類型中定義的任何一個(gè)位域都必須在同一個(gè)字中,若本字中剩余的二進(jìn) 制位數(shù)不夠定義一個(gè)位域時(shí),則該字的剩余二進(jìn)制位不用,而從下一個(gè)字開始。若制位數(shù)不夠定義一個(gè)位域時(shí),則該字的剩余二進(jìn)制位不用,而從下一個(gè)字開始。若 需要跳過某些不用的二進(jìn)制位,也可定義一個(gè)無名的位域。需要跳過某些不用的二進(jìn)制位,也可定義一個(gè)無名的位域。 【例】【例】struct data unsigned fla

30、g1 : 2 ; unsigned flag2 : 4 ; unsigned : 2 ; /無名位域,跳過無名位域,跳過2個(gè)不用的二進(jìn)制位個(gè)不用的二進(jìn)制位 unsigned flag3 : 6 ; unsigned flag4 : 2 ; ; 21 位域(選讀)位域(選讀) l 位域變量的定義:(等同于結(jié)構(gòu)體變量的定義)位域變量的定義:(等同于結(jié)構(gòu)體變量的定義) 格式格式1: 存儲類型存儲類型 結(jié)構(gòu)體類型名結(jié)構(gòu)體類型名 變量名變量名1 ,變量名,變量名2 ; 格式格式2: 存儲類型存儲類型 struct 結(jié)構(gòu)體類型名結(jié)構(gòu)體類型名 變量名變量名1 ,變量名,變量名2 ; l 位域變量的使用:(等

31、同于結(jié)構(gòu)體變量的使用)位域變量的使用:(等同于結(jié)構(gòu)體變量的使用) 同類型的位域變量之間可以相互賦值,這種賦值等同于各個(gè)成員的依次賦值。位域同類型的位域變量之間可以相互賦值,這種賦值等同于各個(gè)成員的依次賦值。位域 變量與結(jié)構(gòu)體變量一樣,也可以作為函數(shù)的參數(shù)。變量與結(jié)構(gòu)體變量一樣,也可以作為函數(shù)的參數(shù)。 位域變量不能直接進(jìn)行輸入位域變量不能直接進(jìn)行輸入/輸出,位域變量的每個(gè)成員都是作為一個(gè)整型變量來使輸出,位域變量的每個(gè)成員都是作為一個(gè)整型變量來使 用,但是其取值范圍受到指定給其的二進(jìn)制位數(shù)限制,若所賦的值大于該成員所能用,但是其取值范圍受到指定給其的二進(jìn)制位數(shù)限制,若所賦的值大于該成員所能 表示

32、的范圍,超過的高位部分被舍棄,即按取模后的數(shù)存入該成員。表示的范圍,超過的高位部分被舍棄,即按取模后的數(shù)存入該成員。 使用位域的目的是節(jié)省內(nèi)存空間,但存取位域變量值時(shí)所花費(fèi)的時(shí)間較多,若內(nèi)存使用位域的目的是節(jié)省內(nèi)存空間,但存取位域變量值時(shí)所花費(fèi)的時(shí)間較多,若內(nèi)存 足夠大,使用位域就沒有意義了。位域變量主要用于系統(tǒng)程序設(shè)計(jì)中。足夠大,使用位域就沒有意義了。位域變量主要用于系統(tǒng)程序設(shè)計(jì)中。 22 【例】(位域)【例】(位域) #include #include struct data unsigned f1 : 2 ; unsigned f2 : 4 ; unsigned : 2 ; unsign

33、ed f3 : 6 ; unsigned f4 : 2 ; ; void main ( ) data d1 , d2 ; d1.f1 = 5 ; d1.f2 = 5 ; d1.f3 = 0 x3f ; d1.f4 = 3 ; cout “d1:” setw(10) d1.f1 setw(10) d1.f2 ; cout setw(10) d1.f3 setw(10) d1.f4 ; cout “tt字節(jié)數(shù):字節(jié)數(shù):” sizeof( d1 ) endl ; d2 = d1 ; cout “d2:” setw(10) d2.f1 setw(10) d2.f2 ; cout setw(10) d2

34、.f3 setw(10) d2.f4 ; cout “tt字節(jié)數(shù):字節(jié)數(shù):” sizeof( d2 ) endl ; 運(yùn)行:運(yùn)行: d1: 1 5 63 3 字節(jié)數(shù):字節(jié)數(shù):4 d2: 1 5 63 3 字節(jié)數(shù):字節(jié)數(shù):4 23 共同體(選讀)共同體(選讀) l 共同體(聯(lián)合體)屬于構(gòu)造數(shù)據(jù)類型共同體(聯(lián)合體)屬于構(gòu)造數(shù)據(jù)類型 :指將不同類型的變量組織成一個(gè)整體,利用:指將不同類型的變量組織成一個(gè)整體,利用 內(nèi)存覆蓋技術(shù),使它們在內(nèi)存中共用同一段存儲區(qū)域。內(nèi)存覆蓋技術(shù),使它們在內(nèi)存中共用同一段存儲區(qū)域。 l 共同體與結(jié)構(gòu)體區(qū)別:結(jié)構(gòu)體變量所占內(nèi)存長度是各成員所占內(nèi)存長度之和,各成共同體與結(jié)構(gòu)體

35、區(qū)別:結(jié)構(gòu)體變量所占內(nèi)存長度是各成員所占內(nèi)存長度之和,各成 員獨(dú)自占有自己的內(nèi)存區(qū)域。而共同體變量所占內(nèi)存長度是其最長成員的長度,各員獨(dú)自占有自己的內(nèi)存區(qū)域。而共同體變量所占內(nèi)存長度是其最長成員的長度,各 成員共用同一段內(nèi)存區(qū)域。成員共用同一段內(nèi)存區(qū)域。 l 共同體類型的定義共同體類型的定義 : union 共同體類型名共同體類型名 類型類型 成員名成員名1 ; 類型類型 成員名成員名2 ; 類型類型 成員名成員名 n ; ; /此處分號不可缺少此處分號不可缺少 l 說明:對結(jié)構(gòu)體類型所作的說明也適用于共同體。說明:對結(jié)構(gòu)體類型所作的說明也適用于共同體。 24 共同體(選讀)共同體(選讀) l

36、 共同體變量的定義:(雷同于結(jié)構(gòu)體變量的定義)共同體變量的定義:(雷同于結(jié)構(gòu)體變量的定義) 格式格式1: 存儲類型存儲類型 共同體類型名共同體類型名 變量名變量名1 ,變量名,變量名2 ; 格式格式2: 存儲類型存儲類型 union 共同體類型名共同體類型名 變量名變量名1 ,變量名,變量名2 ; l 共同體變量的使用:共同體變量的使用: 一個(gè)共同體變量中的所有成員共用同一段內(nèi)存區(qū)域,共同體變量所占內(nèi)存區(qū)域的大一個(gè)共同體變量中的所有成員共用同一段內(nèi)存區(qū)域,共同體變量所占內(nèi)存區(qū)域的大 小由占用最大內(nèi)存區(qū)域的成員所決定。小由占用最大內(nèi)存區(qū)域的成員所決定。 任一時(shí)刻,一個(gè)共同體變量中只能有一個(gè)成員起

37、作用。任一時(shí)刻,一個(gè)共同體變量中只能有一個(gè)成員起作用。 定義共同體變量時(shí)不能對其進(jìn)行初始化定義共同體變量時(shí)不能對其進(jìn)行初始化 。 使用共同體的目的是節(jié)省內(nèi)存空間,現(xiàn)在內(nèi)存越來越大,通常的程序設(shè)計(jì)中已較少使用共同體的目的是節(jié)省內(nèi)存空間,現(xiàn)在內(nèi)存越來越大,通常的程序設(shè)計(jì)中已較少 使用。共同體主要用于計(jì)算機(jī)底層的程序設(shè)計(jì)中。使用。共同體主要用于計(jì)算機(jī)底層的程序設(shè)計(jì)中。 l 共同體變量成員的引用:(使用成員運(yùn)算符共同體變量成員的引用:(使用成員運(yùn)算符 “.” ) 共同體變量名共同體變量名 . 成員名成員名 25 【例】(共同體)【例】(共同體) #include #include union data

38、 char a ; int b ; short m ; float n ; ; void main ( ) data d ; d.b = 39000 ; cout “各成員值:各成員值:” setw(4) d.a setw(12) d.b ; cout setw(12) d.m setw(20) d.n endl ; d.a = A ; cout “各成員值:各成員值:” setw(4) d.a setw(12) d.b ; cout setw(12) d.m setw(20) d.n endl ; cout “字節(jié)數(shù)字節(jié)數(shù)=” sizeof( d ) “t首地址首地址=” (int) cou

39、t “a地址地址=” (int) cout “tm地址地址=” (int) a b c ddata 運(yùn)行:運(yùn)行: 各成員值:各成員值: X 39000 -26536 5.46506e-041 各成員值:各成員值: A 38977 -26559 5.46184e-041 字節(jié)數(shù)字節(jié)數(shù)=4 首地址首地址=1245052 a地址地址=1245052 b地址地址=1245052 c地址地址=1245052 d地址地址=1245052 26 枚舉類型的定義枚舉類型的定義 l 枚舉類型屬于構(gòu)造數(shù)據(jù)類型枚舉類型屬于構(gòu)造數(shù)據(jù)類型 : 如果一個(gè)變量僅有幾種可能的取值,可以定義為枚舉類型的變量。在定義枚舉類型如果

40、一個(gè)變量僅有幾種可能的取值,可以定義為枚舉類型的變量。在定義枚舉類型 的變量之前,必須先定義枚舉類型。的變量之前,必須先定義枚舉類型。 枚舉類型是指將可能的取值一一列舉出來,對于該枚舉類型的變量,其取值僅限于枚舉類型是指將可能的取值一一列舉出來,對于該枚舉類型的變量,其取值僅限于 列舉出來的范圍內(nèi)。枚舉類型是為了一些具有特殊列舉出來的范圍內(nèi)。枚舉類型是為了一些具有特殊“離散離散”值域的數(shù)據(jù)而引入的。值域的數(shù)據(jù)而引入的。 【例】對于取值于【例】對于取值于 “星期幾星期幾” 的數(shù)據(jù),可定義一個(gè)名為的數(shù)據(jù),可定義一個(gè)名為 weekday 的數(shù)據(jù)類型,該類的數(shù)據(jù)類型,該類 型的變量取值僅限于型的變量取

41、值僅限于 sun、mon、tue、wed、thu、fri、sat 七個(gè)中的一個(gè),那么七個(gè)中的一個(gè),那么 weekday 就是一個(gè)枚舉類型。就是一個(gè)枚舉類型。 enum weekday sun , mon , tue , wed , thu , fri , sat ; weekday w1 = mon ; /w1是是weekday類型的變量類型的變量 weekday w2 = sat ; /w2是是weekday類型的變量類型的變量 27 枚舉類型的定義枚舉類型的定義 l 枚舉類型的定義枚舉類型的定義 : enum 枚舉類型名枚舉類型名 枚舉常量枚舉常量1 ,枚舉常量,枚舉常量2 , , 枚舉常

42、量枚舉常量n ; l 幾點(diǎn)說明:幾點(diǎn)說明: 枚舉常量(枚舉元素)是以標(biāo)識符形式表示的整型量,不是字面常量。各枚舉常量枚舉常量(枚舉元素)是以標(biāo)識符形式表示的整型量,不是字面常量。各枚舉常量 代表該枚舉類型變量的可能取值,它們之間以代表該枚舉類型變量的可能取值,它們之間以“ , ”分隔。分隔。 編譯器為每個(gè)枚舉常量指定一個(gè)內(nèi)部整數(shù)值,默認(rèn)狀態(tài)下,這個(gè)整數(shù)值就是列舉時(shí)編譯器為每個(gè)枚舉常量指定一個(gè)內(nèi)部整數(shù)值,默認(rèn)狀態(tài)下,這個(gè)整數(shù)值就是列舉時(shí) 的順序號,序號從的順序號,序號從0開始,按列舉順序依次為:開始,按列舉順序依次為: 0、1、2、3、. 。 【例】【例】enum color red , yel

43、low , blue , black , white ; 則枚舉常量則枚舉常量 red、yellow、blue、black、white 的值分別是:的值分別是: 0、1、2、3、4 。 28 枚舉類型的定義枚舉類型的定義 定義枚舉類型時(shí),也可為部分或全部的枚舉常量另行指定整數(shù)值,而對于具有指定定義枚舉類型時(shí),也可為部分或全部的枚舉常量另行指定整數(shù)值,而對于具有指定 值后面那些無指定的枚舉常量,則按依次加值后面那些無指定的枚舉常量,則按依次加1的原則取值。注意,各枚舉常量的整數(shù)的原則取值。注意,各枚舉常量的整數(shù) 值可以相同,但各枚舉常量的標(biāo)識符必須不同。值可以相同,但各枚舉常量的標(biāo)識符必須不同。 【例】【例】 enum weekday sun=7 , mon=1 , tue , wed , t

溫馨提示

  • 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論