C語言程序設計(第7章結(jié)構(gòu)體與共用體)5

字號:

7.5 共用體
     所謂共用體類型是指將不同的數(shù)據(jù)項組織成一個整體,它們在內(nèi)存中占用同一段存儲單元。其定義形式為:
     union 共用體名
     {成員表列};
    7.5.1 共用體的定義
    union data
    {
     int a ;
     float b;
     doublec;
     chard;
    }obj;
     該形式定義了一個共用體數(shù)據(jù)類型union data ,定義了共用體數(shù)據(jù)類型變量obj。共用體數(shù)據(jù)類型與結(jié)構(gòu)體在形式上非常相似,但其表示的含義及存儲是完全不同的。先讓我們看一個小例子。
    [例7 - 8 ]
    union data /*共用體*/
    {
     int a;
     float b;
     double c;
     char d;
    }mm;
    struct stud /*結(jié)構(gòu)體* /
    {
     int a;
     float b;
     double c;
     char d;
    };
    main( )
    {
     struct stud student;
     printf("%d,%d",sizeof(struct stud),sizeof(union data));
    }
    運行程序輸出:
    15,8
     程序的輸出說明結(jié)構(gòu)體類型所占的內(nèi)存空間為其各成員所占存儲空間之和。而形同結(jié)構(gòu)體的共用體類型實際占用存儲空間為其最長的成員所占的存儲空間。詳細說明如圖7 - 6所示。
     對共用體的成員的引用與結(jié)構(gòu)體成員的引用相同。但由于共用體各成員共用同一段內(nèi)存空間,使用時,根據(jù)需要使用其中的某一個成員。從圖中特別說明了共用體的特點,方便程序設計人員在同一內(nèi)存區(qū)對不同數(shù)據(jù)類型的交替使用,增加靈活性,節(jié)省內(nèi)存。
    7.5.2 共用體變量的引用
     可以引用共用體變量的成員,其用法與結(jié)構(gòu)體完全相同。若定義共用體類型為:
    union data /*共用體*/
    {
     int a;
     float b;
     double c;
     char d;
    }mm;
    其成員引用為:mm.a,mm.b,mm.c,mm.d 但是要注意的是,不能同時引用四個成員,在某一時刻,只能使用其中之一的成員。
    [例7-9] 對共用體變量的使用。
    main( )
    {
     union data
     {
     int a;
     float b;
     double c;
     char d;
     }mm;
     mm.a=6;
     printf("%d\n",mm.a);
     mm.c=67.2;
     printf("%5.1lf\n", mm.c);
     mm.d='W';
     mm.b=34.2;
     printf("%5.1f,%c\n",mm.b,mm.d);
    }
    運行程序輸出為:
    6
    6 7.2
    3 4.2,=
     程序最后一行的輸出是我們無法預料的。其原因是連續(xù)做mm.d='W';mm.b=34.2;兩個連續(xù)的賦值語句最終使共用體變量的成員mm.b所占四字節(jié)被寫入34.2,而寫入的字符被覆蓋了,輸出的字符變成了符號“ =”。事實上,字符的輸出是無法得知的,由寫入內(nèi)存的數(shù)據(jù)決定。
     例子雖然很簡單,但卻說明了共用體變量的正確用法。
    [例7-10] 通過共用體成員顯示其在內(nèi)存的存儲情況。
    定義一個名為time的結(jié)構(gòu)體,再定義共用體dig:
    struct time
    {
     int year; /*年*/
     int month;/*月*/
     int day; /*日*/
    } ;
    union dig
    {
     struct time data; /*嵌套的結(jié)構(gòu)體類型* /
     char byte[6];
    } ;
     假定共用體的成員在內(nèi)存的存儲是從地址1 0 0 0單元開始存放,整個共用體類型需占存儲空間6個字節(jié),即共用體dig的成員data與byte共用這6個字節(jié)的存儲空間,存儲空間分配示意如圖7 - 7所示。
    由于共用體成員d a t a包含三個整型的結(jié)構(gòu)體成員,各占2個字節(jié)。由圖7 - 7所示可見,data.year是由2個字節(jié)組成,用byte字符數(shù)組表示為byte[0]和byte[1]。byte[1]是高字節(jié),byte[0]是低字節(jié)。下面用程序?qū)崿F(xiàn)共用體在內(nèi)存中的存儲。
    struct time
    {
     int year; /*年*/
     int month; /*月*/
     int day; /*日*/
    } ;
    union dig
    {
     struct time data; /*嵌套的結(jié)構(gòu)體類型*/
     char byte[6];
    } ;
    main( )
    {
     union dig unit;
     int i;
     printf("enter year:\n");
     scanf("%d",&unit.data.year); /*輸入年*/
     printf("enter month:\n");
     scanf("%d",&unit.data.month); /* 輸入月*/
     printf("enter day:\n");
     scanf("%d",&unit.data.day); /*輸入日*/
     printf("year=%d month=%d day=%d\n", unit.data.year,unit. data. month, unit.data.day);/*打印輸出*/