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