C语言程序设计(第7章结构体与共用体)5
7.5社区
所谓社区类型,是指将不同的数据项组织成一个整体,在内存中占据相同的存储单元。其定义形式为:
union common body name
{成员表列};
7.5.1常用体的定义
联合数据
{
int a;
浮动b;
doublec;
chard;
} obj;
该表单定义了一个通用数据类型union data和一个通用数据类型变量obj。共享卷数据类型在形式上与结构非常相似,但意义和存储完全不同。我们先来看一个小例子。
[例7-8]
union data/* common body */
{
int a;
浮动b;
双c;
char d;
} mm;
struct stud/* structure */
{
int a;
浮动b;
双c;
char d;
};
main()
{
struct stud student;
printf("%d,%d ",sizeof(结构stud),sizeof(联合数据));
}
运行程序输出:
15,8
程序输出显示结构类型占用的内存空是其成员占用的存储空之和。而结构相同的普通体型,实际上占据了其最长成员所占据的储物空空间。详细描述如图7-6所示。
对公共主体成员的引用与对结构主体成员的引用相同。但是,由于团体的所有成员共享相同的内存空,因此在使用时,请根据需要使用其中一个成员。从图中特别说明了共享体的特点,便于程序员在同一内存区域交替使用不同的数据类型,增加了灵活性,节省了内存。
7.5.2共享变量的引用
可以引用共享变量的成员,其用法与结构完全相同。如果共享体类型定义为
union data/* shared body */
{
int a;
浮动b;
双c;
char d;
} mm;
它的成员引用有:mm.a、mm.b、mm.c、mm.d,但是需要注意的是不能同时引用四个成员,在某一时刻只能使用其中一个。
[例7-9]常用体积变量的使用。
main()
{
union data
{
int a;
浮动b;
双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‘w’是连续完成的;mm.b = 34.2两个连续的赋值语句最终使得公共变量的成员mm.b占用的四个字节被写入34.2,而写入的字符被覆盖,输出的字符变成了符号“=”。实际上,字符的输出是未知的,由写入内存的数据决定。
虽然这个例子非常简单,但它说明了共享变量的正确用法。
[例7-10]通过公共体的成员显示其在内存中的存储。
定义一个名为time的结构,然后定义公共体dig:
struct time
{
int year;/* year */
int month;/* month */
int天;/*天*/
};
union dig
{
构造时间数据;/*嵌套结构类型*/
char byte[6];
};
假设社团成员从地址单元1 0 0 0存储在内存中,整个社团类型需要占用内存空中的6个字节,即社团成员dig共享这6个字节的内存空,内存空之间的分配如图7-7所示。
因为公共体成员d a t a包含三个整数结构成员,每个成员有2个字节。如图7-7所示,data.year由2个字节组成,用字节字符数组表示为byte[0]和byte[1]。字节[1]是高位字节,字节[0]是低位字节。使用下面的程序实现内存中公共体的存储。
结构时间
{
int年;/* year */
int month;/* month */
int天;/*天*/
};
union dig
{
构造时间数据;/*嵌套结构类型*/
char byte[6];
};
main()
{
union dig unit;
int I;
printf("输入年份:\ n ");
scanf("%d ",& unit . data . year);/*输入年份*/
printf("输入月份:\ n ");
scanf("%d ",& unit . data . month);/*输入月份*/
printf("输入日期:\ n ");
scanf("%d ",& unit . data . day);/*输入日期*/
printf("年=% d月=% d日=% d \ n ",unit.data.year,unit.data.month,unit . data . day);/*打印输出*/
0条评论