c语言中union嵌套struct

union {                   /*定义一个联合*/
	  char i[60];
	  int x;
	  struct {             /*在联合中定义一个结构*/
		  char first;
		  char second;
		  char third;
		  char fourth;
		  char five;
	  }str;
  }number;
  strcpy(number.i, "abcde");
  printf("%s\n",number.i);//输出结果"abcde"
  printf("%c%c\n", number.str.first, number.str.second);//输出结果"ab"
  printf("%c%c%c\n", number.str.third, number.str.fourth, number.str.five);//输出结果"abcde"
  printf("%d\n",sizeof(number));//输出结果60

联合体中所有的成员变量的起始地址都是一样的
联合体的大小:受到两个因素限制,一个是一定要大于等于联合体中最大成员变量的字节数,还有一个因素就是一定要是union所有成员变量类型的字节数的最小整数倍
注意:为了实现字节对齐,有可能遇到字节不对齐的情况,比如联合体中有一个char数组,它的是12,char占的字节数为1,那么char这个数组所占字节数为12,它在整个union结构体中,所占字节数最大,还有一个double类型,double占的字节数为8,那么使用sizeof计算这个结构体长度的时候是16
联合体的赋值每一次也就能保证一个成员变量有效,其他成员变量处于无用状态,这种无用指的是当类型不一致时,你从同样一个内存地址读取数据时,可能会出问题
在这里插入图片描述
而结构体的内存分布
在这里插入图片描述
总结:
数据在内存中存储的时候都是一样的格式,都是二进制,我们可以将这些二进制会转换成整数,因为二进制和整数是一一对应的,在自然界中我们更偏向于用整数来标记字符,比如我们用Ascall码来定义字符,Ascall规定具体的整数对应具体的字符,那么计算机会将整数读入内存,我们解析的时候就一个字节一个字节读取计算机内存中的整数,然后用这个整数来和Ascall码表比照来兑换我们要的字符,至于高级语言给我们提供的类型,比如char,int,float,double等,还有我们自己定义的结构体,其实这些类型都只是告诉我们长度,系统在给我们的数据分配内存的时候,会给一个首地址,我们按照这个内存首地址和内存长度来读取数据,当然,结构体除了有长度意外,它里面的变量地址分布也有一定的规则,这就像上面两个地址分配图一样

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值