7.5 共用体
7.5.1 共用体的定义
7.5.2 共用体变量的引用
对共用体的成员的引用与结构体成员的引用相同。但由于共用体各成员共用同一段内存空间,使用时,根据需要使用其中的某一个成员。从图中非凡说明了共用体的特点,方便程序设计人员在同一内存区对不同数据类型的交替使用,增加灵活性,节省内存。
7.5.2 共用体变量的引用
可以引用共用体变量的成员,其用法与结构体完全相同。若定义共用体类型为:
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,=
程序最后一行的输出是我们无法预料的。其原因是连续做mm.d='W';mm.b=34.2;两个连续的赋值语句最终使共用体变量的成员mm.b所占四字节被写入34.2,而写入的字符被覆盖了,输出的字符变成了符号“ =”。事实上,字符的输出是无法得知的,由写入内存的数据决定。
例子虽然很简单,但却说明了共用体变量的正确用法。
[例7-10] 通过共用体成员显示其在内存的存储情况。
定义一个名为time的结构体,再定义共用体dig:
struct time
{
int year; /*年*/
int month;/*月*/
int day; /*日*/
} ;
union dig
{
struct time data; /*嵌套的结构体类型* /
char byte[6];
} ;
假定共用体的成员在内存的存储是从地址1 0 0 0单元开始存放,整个共用体类型需占存储空间6个字节,即共用体dig的成员data与byte共用这6个字节的存储空间,存储空间分配示意如图7 - 7所示。
由于共用体成员d a t a包含三个整型的结构体成员,各占2个字节。由图7 - 7所示可见,data.year是由2个字节组成,用byte字符数组表示为byte[0]和byte[1]。byte[1]是高字节,byte[0]是低字节。下面用程序实现共用体在内存中的存储。
struct time
{
int year; /*年*/
int month; /*月*/
int day; /*日*/
} ;
union dig
{
struct time data; /*嵌套的结构体类型*/
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);/*打印输出*/
for(i=0;i<6;i++)
printf("%d,",unit.byte[i]); /*按字节以十进制输出*/
printf("\n");
}
运行程序:
enter year:
1976
enter month:
4
enter day:
23
year=1976 month=4 day=23
184,7,4,0,23,0
从程序的输出结果来看, 1976占两个字节,由第0、1字节构成,即7×256+184=1976。4同样占两个字节,由第2、3字节构成, 0×256+4=4,23由第4、5字节构成, 23=0×256+23。
思考题:
在下面这个程序中,假如通过联合体的数组mem_num输出结构asd三个成员char name[6];int age;char adr[10];的值,后面的语句应怎样写?
void main()
{
int *p;
union mem_union
{
struct mem_struct
{
char name[6];
int age;
char adr[10];
}asd;
unsigned char mem_num[sizeof(struct mem_struct)];
}worm;
....
....
}
Word教程网 | Excel教程网 | Dreamweaver教程网 | Fireworks教程网 | PPT教程网 | FLASH教程网 | PS教程网 |
HTML教程网 | DIV CSS教程网 | FLASH AS教程网 | ACCESS教程网 | SQL SERVER教程网 | C语言教程网 | JAVASCRIPT教程网 |
ASP教程网 | ASP.NET教程网 | CorelDraw教程网 |