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);/*打印輸出*/
所謂共用體類型是指將不同的數(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);/*打印輸出*/