自定义类型:联合体知识点总结

联合体: 和结构体形式差不多,都是包含一系列的成员。但是联合体相较结构体来说有一点特殊就是:联合体的所有成员共用一快内存空间。

//联合体的声明
 union Un{
  char c;
  int i;
 };
 union Un un;//定义一个联合体变量 

第一个成员变量的地址跟联合体的地址一样,这点跟结构体类似。
在这里插入图片描述
联合体的特点:成员共用一个内存空间,这样联合体的大小,至少是最大成员的大小。

 union Un{
  char a;
  int b;
 }un;
 printf("%d\n",sizeof(un));

在这里插入图片描述
从图片我们可以看到联合体的总大小为4。这是因为联合体的成员共用一个内存空间,而联合体的大小就是联合体里面的最大成员的大小。而这个最大成员就是b,大小为4个字节,所以结构体的大小就为4。
这个知识点在面试中也会出题,如:

 union Un{
  char a;
  int b;
 }un;
un.a = 0x11223344;
un.b = 0x55;
printf("%x\n",un.i);

算这道题之前我们首先要知道计算机在内存中是怎样存储的?也就是按大端还是小端存储的?所以我们要先了解计算机的大小端存储,我们用联合体的知识写一下这个代码。

int IsLittleEnd(){
union Un{
	char a;
	int b;
	}un;
un.b = 0x1;
   if(un.a == 0x1){
      return 1;
   }else{
      return 0;
  }
}

一般计算机是按小端字节序来存储的,所以我们来看上面这个题。

在这里插入图片描述
联合体大小的计算

  • 联合的大小至少是最大成员的大小
  • 当最大成员的大小不是最大对齐数的整数倍的时候,就要对齐到最大对齐数的整数倍
 union Un {
  char a[10];
  int b;
 }un;
 printf("%d\n", sizeof(un));

在这里插入图片描述

在这里,联合体的最大成员是一个数组,大小为10个字节。最大对齐数为4(成员b的对齐数),所以联合体的总大小就要为4的整数倍。而10不是4的整数倍,所以就要再补两个字节凑成4的整数倍,所以结果就为12。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值