c语言联合体定义中冒号作用,c语言结构体和共用体,实验心得.docx

c语言结构体和共用体,实验心得

所谓共用体类型是指将不同的数据项组织成一个整体,它们在内存中占用同一段存储单元。其定义形式为:  union共用体名  {成员表列};  共用体的定义  uniondata  {  inta;  floatb;  doublec;  chard;  }obj;  该形式定义了一个共用体数据类型uniondata,定义了共用体数据类型变量obj。共用体  数据类型与结构体在形式上非常相似,但其表示的含义及存储是完全不同的。先让我们看一个小例子。  [例7-8]  uniondata/*共用体*/  {  inta;  floatb;  doublec;  chard;  }mm;  structstud/*结构体*/  {  inta;  floatb;  doublec;  chard;  };  main()  {  structstudstudent  printf("%d,%d",sizeof(structstud),sizeof(uniondata));  }  程序的输出说明结构体类型所占的内存空间为其各成员所占存储空间之和。而形同结构体的  共用体类型实际占用存储空间为其最长的成员所占的存储空间。详细说明如图7-6所示。  对共用体的成员的引用与结构体成员的引用相同。但由于共用体各成员共用同一段内存空间,使用时,根据需要使用其中的某一个成员。从图中特别说明了共用体的特点,方便程序设计人员在同一内存区对不同数据类型的交替使用,增加灵活性,节省内存。  共用体变量的引用  可以引用共用体变量的成员,其用法与结构体完全相同。若定义共用体类型为:  uniondata/*共用体*/  {  inta;  floatb;  doublec;  chard;  }mm;  其成员引用为:mm.a,mm.b,mm.c,mm.d  但是要注意的是,不能同时引用四个成员,在某一时刻,只能使用其中之一的成员。  [例7-9]对共用体变量的使用。  main()  {  uniondata  {  inta;  floatb;  doublec;  chard;  }mm;  mm.a=6;  printf("%d\n",);  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);  }  程序最后一行的输出是我们无法预料的。其原因是连续做mm.d='W';mm.b=34.2;两个  连续的赋值语句最终使共用体变量的成员mm.b所占四字节被写入34.2,而写入的字符被覆盖  了,输出的字符变成了符号“=”。事实上,字符的输出是无法得知的,由写入内存的数据决  定。  例子虽然很简单,但却说明了共用体变量的正确用法。  [例7-10]通过共用体成员显示其在内存的存储情况。  定义一个名为time的结构体,再定义共用体dig:  structtime  {  intyear;/*年*/  intmonth;/*月*/  intday;/*日*/  };  uniondig  {  structtimedata;/*嵌套的结构体类型*/  charbyte[6];  };  假定共用体的成员在内存的存储是从地址1000单元开始存放,整个共用体类型需占存储空间6个字节,即共用体dig的成员data与byte共用这6个字节的存储空间,存储空间分配示意如图7-7所示。  由于共用体成员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:\n");  scanf("%d",&unit.data.year);/*输入年*/  printf("entermonth:\n");  scanf("%d",&unit.data.month);/*输

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值