可以引用共用体变量的成员,其用法与结构体完全相同。若定义共用体类型为:
uniondata/*共用体*/
{inta;
floatb;
doublec;
chard;
}mm;
其成员引用为:mm.a,mm.b,mm.c,mm.d,但是要注意的是,不能同时引用四个成员,在某一时刻只能使用其中之一的成员。
【例11.9】对共用体变量的使用。
main()
{uniondata
{inta;
floatb;
doublec;
chard;
}mm;
mm.a=6;
printf("%d\n",mm.a);
mm.c=67.2;
printf("%5.1f\n",mm.c);
mm.d='W';
mm.b=34.2;
printf("%5.1f,%c\n",mm.b,mm.d);
}
运行程序输出为
6
67.2
34.2,=
程序最后一行的输出是无法预料的。其原因是连续执行mm.d='W';,mm.b=34.2;两个连续的赋值语句,最终使共用体变量的成员mm.b所占四字节被写入34.2,而写入的字符被覆盖了,输出的字符变成了符号 “=”。事实上,字符的输出是无法得知的,由写入内存的数据决定。例子虽然很简单,但却说明了共用体变量的正确用法。
【例11.10】通过共用体成员显示其在内存的存储情况。
定义一个名为time的结构体,再定义共用体dig:
structtime
{intyear;/*年*/
intmonth;/*月*/
intday;/*日*/
};
uniondig
{structtimedata;/*嵌套的结构体类型*/
charbyte[6];
};
假定共用体的成员在内存的存储是从地址1000单元开始存放的,整个共用体类型需占6字节存储空间,即共用体dig的成员data与byte共用这6字节的存储空间,
存储空间分配示意如图11-4所示。共用体成员data包含三个整型的结构体成员,各占2个字节。由图11-4可见,data.year是由2个字节组成的,用byte字符数组表示为byte[0]和byte[1]。byte[1]是高字节,byte[0]是低字节。下面用程序实现共用体在内存中的存储。
图11-4
structtime
{intyear;/*年*/
intmonth;/*月*/
intday;/*日*/
};
uniondig
{structtimedata;/*嵌套的结构体类型*/
charbyte[6];
};
main()
{uniondigunit;
inti;
printf("enteryear:\n");
scanf("%d",&unit.data.year);/*输入年*/
printf("entermonth:\n");
scanf("%d",&unit.data.month);/*输入月*/
printf("enterday:\n");
scanf("%d",&unit.data.day);/*输入日*/
printf("year=%dmonth=%dday=%d\n",unit.data.year,unit.data.month, unit.
data.day);/*打印输出*/
for(i=0;i<6;i++)
printf("%d,",unit.byte[i]);/*按字节以十进制输出*/
printf("\n");
}
运行程序:
enteryear:
1976
entermonth:
4
enterday:
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。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。