官术网_书友最值得收藏!

icon2

1.6 結構體、公用體、枚舉

1.6.1 結構體、共用體、枚舉的概念

1.結構體的聲明方法

結構體的聲明方法如下所示:


struct 結構名{
    數(shù)據(jù)類型 成員名;
    數(shù)據(jù)類型 成員名;
    ...
};

成員表由若干成員組成,每個成員都是該結構的一個組成部分,對每個成員也必須做類型聲明。例1.11說明了結構體的使用方法。

【例1.11】 結構體使用范例。


#include<iostream>
#include<string.h>
using namespace std;
struct student{               // 聲明一個結構體類型student
    int num;
    char name[20];
    int age;
};                         // 最后有一個分號
int main(){
    struct student stu1;          // 定義一個student類型的變量stu1
    student stu2;               // 定義時也可以不用struct
    stu1.num=1;               // 單獨對st1num元素賦值
    char temp[20]="Xiao ming";
    strncpy(stu1.name,temp,strlen(temp));
    stu1.age=10;
    cout<<stu1.num<<" "<<stu1.name<<" "<<stu1.age<<endl;
    student *stu3=&stu1;          // stu3是結構體的指針,指向stu1
    (*stu3).num=2;          // stu1num值被修改成了2;
    cout<<stu1.num<<" "<<stu1.name<<" "<<stu1.age<<endl;
    return 0;
}

程序的執(zhí)行結果是:


1 Xiao ming 10
2 Xiao ming 10

例1.11中聲明了一個結構體類型student,定義了兩個student類型的變量stu1和stu2,分別用了兩種定義方法,分別是前面有struct關鍵字和沒有struct關鍵字。這兩種定義方法都是可以的,顯然沒struct關鍵字的使用更為方便。

引用結構體變量中成員的一般方式為:


結構體變量名.成員名

例1.11中,stu1.num表示結構體變量stu1中的成員數(shù)量的值。

指針也可以應用于結構體,例1.11中stu3就是一個結構體變量,指向stu1。

2.共用體

共用體,用關鍵字union來定義,它是一種特殊的類。在一個共用體里可以定義多種不同的數(shù)據(jù)類型,這些數(shù)據(jù)共享一段內(nèi)存,在不同的時間里保存不同的數(shù)據(jù)類型和長度的變量,以達到節(jié)省空間的目的。但同一時間只能儲存其中一個成員變量的值。

共用體的聲明方式為:


union 共用體類型名{
    數(shù)據(jù)類型 成員名;
    數(shù)據(jù)類型 成員名;
    ...
}變量名;

可以使用union判斷系統(tǒng)是big endian(大端)還是little endian(小端)。

【例1.12】 判斷系統(tǒng)是big endian還是little endian。


#include<iostream>
using namespace std;
union TEST{
    short a;
    char b[sizeof(short)];
};
int main(){
    TEST test;
    test.a=0x0102;// 不能引用共用體變量,只能引用共用體變量中的成員。
    if(test.b[0]==0x01&&test.b[1]==0x02){
        cout<<"big endian."<<endl;
    }
    else if(test.b[0]==0x02&&test.b[1]==0x01){
        cout<<"small endian."<<endl;
    }
    else{
        cout<<"unknown"<<endl;
    }
    return 0;
}

程序的執(zhí)行結果是:


small endian.

其中,big endian是指低地址存放最高有效字節(jié),little endian則是低地址存放最低有效字節(jié)。如果將0x1234abcd寫入0x0000開始的內(nèi)存中,則結果如表1-2所示。

表1-2 big endian和little endian的內(nèi)存地址增長方向

表1-2展示了0x1234abcd分別在big endian的系統(tǒng)和在little endian的系統(tǒng)上的內(nèi)存地址是怎么樣分布的。例如0x0000是1Byte的存儲單元,0x12單元一共占了8bit,也就是1byte,即占用了1Byte。

目前,幾乎所有網(wǎng)絡協(xié)議都是采用big endian的方式來傳輸數(shù)據(jù)的,當兩臺采用不同字節(jié)序的主機通信時,在發(fā)送數(shù)據(jù)之前都必須經(jīng)過字節(jié)序的轉換成為網(wǎng)絡字節(jié)序(big endian)后再進行傳播。

3.枚舉

在實際問題中,有些變量的取值被限定在一個有限的范圍內(nèi)。例如,一個星期只有7天,一年只有12個月,一個班每周有6門課程等。如果把這些量說明為整型,字符型或其他類型顯然是不妥當?shù)摹榇耍珻語言提供了一種稱為“枚舉”的類型,枚舉類型在C++中也同樣適用。在“枚舉”類型的定義中列舉出所有可能的取值,用來說明該“枚舉”類型的變量取值不能超過定義的范圍。應該說明的是,枚舉類型是一種基本數(shù)據(jù)類型,而不是一種構造類型,因為它不能再分解為任何其他基本類型。

枚舉的聲明方式為:


enum 枚舉類型名{枚舉常量表列};

如同結構和共用體一樣,枚舉變量也可用不同的方式說明,即先定義后說明,同時定義說明或直接說明。

設有變量a,b,c是枚舉類型weekday,可采用下述任一種方式:


enum weekday{ sun,mou,tue,wed,thu,fri,sat };
enum weekday a,b,c;

或者為:


enum weekday{ sun,mou,tue,wed,thu,fri,sat }a,b,c;

或者為:


enum { sun,mou,tue,wed,thu,fri,sat }a,b,c;

枚舉值是常量,不是變量。不能在程序中用賦值語句再對它賦值。

例如對枚舉weekday的元素再作以下賦值,都是錯誤的:


sun=5;
mon=2;
sun=mon;

只能把枚舉值賦予枚舉變量,不能把元素的數(shù)值直接賦予枚舉變量,如下面的語句是正確的:


a=sum;
b=mon;

而下面的語句則是錯誤的:


a=0;
b=1;

如一定要把數(shù)值賦予枚舉變量,則必須用強制類型轉換,如:


a=(enum weekday)2;

其意義是將順序號為2的枚舉元素賦予枚舉變量a,相當于:


a=tue;

還應該說明的是枚舉元素不是字符常量也不是字符串常量,使用時不要加單、雙引號。

【例1.13】 enum使用范例。


#include<iostream>
using namespace std;
int main(){
    enum weather{sunny,cloudy,rainy,windy};
    /*其中sunny=0,cloudy=1,rainy=2,windy=3,
    默認地,第一個枚舉子被賦值為0*/
    enum fruits{apple=3,orange,banana=7,bear};
    /*也可以顯式地賦值,接下來的枚舉子取值是前面一個枚舉子的取值+1,即orange=4bear=8*/
    cout<<orange<<endl;
    enum big_cities{guangzhou=1,shenzhen=3, eijing=1,shanghai=2};
    /*同一枚舉中的枚舉子的取值不需要是唯一的*/
    return 0;
}

程序的執(zhí)行結果是:


4

例1.13中定義了3個枚舉類型:weather、fruits和big_cities,其中weather中的枚舉子都被顯式地賦值了,fruits中的枚舉子只賦值了其中幾個,沒顯式賦值的則是前面一個枚舉子的取值+1。同一枚舉類型中的枚舉子的取值不需要是唯一的,可以相同。

主站蜘蛛池模板: 紫云| 潜江市| 岗巴县| 南岸区| 沙湾县| 珲春市| 沅江市| 布拖县| 北碚区| 宁南县| 栾川县| 太湖县| 宿迁市| 阿克苏市| 竹北市| 白玉县| 抚州市| 延川县| 罗江县| 贵定县| 黑龙江省| 洛扎县| 苍梧县| 涞源县| 英山县| 鄂伦春自治旗| 盐城市| 高雄市| 栖霞市| 铜山县| 大足县| 溧水县| 宁乡县| 嘉兴市| 迁安市| 东阿县| 昆明市| 广宗县| 中牟县| 米易县| 扎囊县|