[2017年整理]c语言结构体与共用体之间的区别

[2017年整理]c语言结构体与共用体之间的区别

ID:9287400

大小:94.00 KB

页数:12页

时间:2018-04-26

[2017年整理]c语言结构体与共用体之间的区别_第1页
[2017年整理]c语言结构体与共用体之间的区别_第2页
[2017年整理]c语言结构体与共用体之间的区别_第3页
[2017年整理]c语言结构体与共用体之间的区别_第4页
[2017年整理]c语言结构体与共用体之间的区别_第5页
资源描述:

《[2017年整理]c语言结构体与共用体之间的区别》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、http://dev.21tx.com/2005/03/25/12365.html所谓共用体类型是指将不同的数据项组织成一个整体,它们在内存中占用同一段存储单元。其定义形式为:union共用体名{成员表列};7.5.1共用体的定义uniondata{inta;floatb;doublec;chard;}obj;该形式定义了一个共用体数据类型uniondata,定义了共用体数据类型变量obj。共用体数据类型与结构体在形式上非常相似,但其表示的含义及存储是完全不同的。先让我们看一个小例子。[例7-8]uniondata/*共用体*/{inta

2、;floatb;doublec;chard;}mm;structstud/*结构体*/{inta;floatb;doublec;chard;};main(){structstudstudentprintf("%d,%d",sizeof(structstud),sizeof(uniondata));}程序的输出说明结构体类型所占的内存空间为其各成员所占存储空间之和。而形同结构体的共用体类型实际占用存储空间为其最长的成员所占的存储空间。详细说明如图7-6所示。对共用体的成员的引用与结构体成员的引用相同。但由于共用体各成员共用同一段内存空间,使

3、用时,根据需要使用其中的某一个成员。从图中特别说明了共用体的特点,方便程序设计人员在同一内存区对不同数据类型的交替使用,增加灵活性,节省内存。7.5.2共用体变量的引用可以引用共用体变量的成员,其用法与结构体完全相同。若定义共用体类型为:uniondata/*共用体*/{inta;floatb;doublec;chard;}mm;其成员引用为:mm.a,mm.b,mm.c,mm.d但是要注意的是,不能同时引用四个成员,在某一时刻,只能使用其中之一的成员。[例7-9]对共用体变量的使用。main(){uniondata{inta;float

4、b;doublec;chard;}mm;mm.a=6;printf("%d",mm.a);mm.c=67.2;printf("%5.1lf",mm.c);mm.d='W';mm.b=34.2;printf("%5.1f,%c",mm.b,mm.d);}程序最后一行的输出是我们无法预料的。其原因是连续做mm.d='W';mm.b=34.2;两个连续的赋值语句最终使共用体变量的成员mm.b所占四字节被写入34.2,而写入的字符被覆盖了,输出的字符变成了符号“=”。事实上,字符的输出是无法得知的,由写入内存的数据决定。例子虽然很简单

5、,但却说明了共用体变量的正确用法。[例7-10]通过共用体成员显示其在内存的存储情况。定义一个名为time的结构体,再定义共用体dig:structtime{intyear;/*年*/intmonth;/*月*/intday;/*日*/};uniondig{structtimedata;/*嵌套的结构体类型*/charbyte[6];};假定共用体的成员在内存的存储是从地址1000单元开始存放,整个共用体类型需占存储空间6个字节,即共用体dig的成员data与byte共用这6个字节的存储空间,存储空间分配示意如图7-7所示。由于共用体成员

6、data包含三个整型的结构体成员,各占2个字节。由图7-7所示可见,data.year是由2个字节组成,用byte字符数组表示为byte[0]和byte[1]。byte[1]是高字节,byte[0]是低字节。下面用程序实现共用体在内存中的存储。structtime{intyear;/*年*/intmonth;/*月*/intday;/*日*/};uniondig{structtimedata;/*嵌套的结构体类型*/charbyte[6];};main(){uniondigunit;inti;printf("enteryear:");

7、scanf("%d",&unit.data.year);/*输入年*/printf("entermonth:");scanf("%d",&unit.data.month);/*输入月*/printf("enterday:");scanf("%d",&unit.data.day);/*输入日*/printf("year=%dmonth=%dday=%d",unit.data.year,unit.data.month,unit.data.day);/*打印输出*/for(i=0;i<6;i++)printf("%d,",unit.

8、byte[i]);/*按字节以十进制输出*/printf("");}从程序的输出结果来看,1976占两个字节,由第0、1字节构成,即7×256+184=1976。4同样占两个字节,由第2、

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。