首页 百科知识 共用体变量的引用

共用体变量的引用

时间:2024-10-03 百科知识 版权反馈
【摘要】:其原因是连续执行mm.d='W';,mm.b=34.2;两个连续的赋值语句,最终使共用体变量的成员mm.b所占四字节被写入34.2,而写入的字符被覆盖了,输出的字符变成了符号 “=”。例子虽然很简单,但却说明了共用体变量的正确用法。共用体成员data包含三个整型的结构体成员,各占2个字节。下面用程序实现共用体在内存中的存储。

可以引用共用体变量的成员,其用法与结构体完全相同。若定义共用体类型为:

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。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈