一、联合(共用体)定义

联合是一种特殊的自定义类型,该种类型定义的变量也包含一系列的成员,特征是这些成员共用同一块空间,所以联合体也被称为共用体。

代码如下(示例):

#include<stdio.h>
union Un//联合类型的声明,union是联合体关键字
{char c;//1字节int i;//4字节
};int main()
{union Un u = {0};printf("%d\n", sizeof(u));printf("%p\n", &u);printf("%p\n", &(u.c));//u.c表示联合体的成员c,该引用方法类似结构体printf("%p\n", &(u.i));
}

运行结果:

分析:

由 sizeof(u) 我们知道这个联合体总计占4个字节,而联合体成员 i 是 int 类型的,它占了4个字节,另外一个 c 是 char 类型占了1个字节,两个一起占了4个字节。说明 c 和 i 必然有一处是共用一块空间的,再者有 u 本身和它的两个成员是一个地址如上图 003EFA80,说明首地址是重合的,简易示图如下:

由于共用空间这种特点就导致了,你改变 c ,i 也会随之改变。这里和结构体是完全不一样的,结构体成员相互独立,但联合体不一样,改变一个其他的也会跟着发生改变。所以这里,在同一时间,你只能使用一个联合体成员,你使用 c 就不要用 i,因为你 c 改变的时候,一定会影响到你i的使用,程序非常容易出问题。

二、联合的特点及运用

联合的成员是共用一块内存空间的,这样一个联合变量的大小,至少是最大成员的大小(因为联合)

我们再来看看联合体在解决判断内存存储是大端存储还是小端存储的优势:

代码如下(示例):

union U
{char c;int i;
}u;//联合体变量创建方法类比结构体int main()
{u.i = 1;      //0x 00 00 00 01(变量i为int类型,有四个字节,32bit)
/*    低地址----------------------------------------------------->高地址hex:01 00 00 00    bin:0000 0001 0000 0000 0000 0000 0000 0000  小端存储 低位放低地址hex:00 00 00 01    bin:0000 0000 0000 0000 0000 0000 0000 0001  大端存储 低位放高地址
*///变量c为char类型,只有一个字节,取前8bit即可if (u.c == 1)       //即u.c = 0000 0001{printf("小端");}else{printf("大端");}
}

运行结果:

分析:

由于 i 和 c 是共用一块内存,我们创建了 i 之后只要判断 1 是在高地址还是低地址即可。又因为 c 是和 i 是一个地址,所以只要判断 c 里面放的是 1 还是 0 即可,非常的方便。(由于我使用的电脑处理器为Intel处理器,因为 Intel 处理器一般都是小端模式,所以此时程序的输出结果为:小端。)

三、联合的大小计算

在计算联合体大小之前我们必须知道两个知识点:

  • 联合的大小至少是最大成员的大小
  • 当最大成员大小不是最大对齐数的整数倍的时候,就要对齐到最大对齐数的整数倍。

举例说明:

#include<stdio.h>union Un1
{char c[5];//1个char类型占1字节,5个占5字节int i;//4字节
};union Un2
{short c[7];//1个short类型占2字节,7个占14字节int i;//4字节
};int main()
{printf("%d\n", sizeof(union Un1));//打印8printf("%d\n", sizeof(union Un2));//打印16
}

运行结果:

8  16

分析:

  • Un1:char 创建一个大小为 5 的数组和放 5 个char类型的是一样道理,对齐数仍然是 1, int 类型的 i 自身大小 4 字节,对齐数是 4 。i 和 c 两个最大的对齐数是 4,而最大成员大小是数组 c(5个字节),5 不是 4 的倍数,我们需要对齐到最大对齐数的整数倍,也就是 8(从 5 到 8 会浪费 3 个字节空间)。
  • Un2:short 创建的 c 数组,我们同上可知其 c 对齐数是 2 ,i 对齐数是4,最大对齐数为4。最大成员大小也就是 c 数组大小为 14 ,14 并不是最大对齐数 4 的整数倍,14 往上对齐到 16, 16 是 4 的整数倍。

C语言联合体union详解相关推荐

  1. C语言联合体union详解与实例

    目录 定义 类型定义 变量定义 存储规则 通过联合体获取存储大小端 和结构体类似,联合体(union)是C语言中一种自定义数据类型.联合体中可以定义多个类型的成员变量,但所有成员共享同一块内存区域,所 ...

  2. 超详细C语言联合体union详解

    文章目录 前言 一.联合(共用体)定义 二.联合的特点及运用 三.联合的大小计算 总结 前言 上一期C语言快速入门我们学习了枚举类型及相关知识点,这期我们来跟着笔者学习一下联合体相关知识,相信聪明的你 ...

  3. (16)System Verilog联合体union详解

    (16)System Verilog联合体union详解 1.1 目录 1)目录 2)FPGA简介 3)System Verilog简介 4)System Verilog联合体union详解 5)结语 ...

  4. 联合体Union详解

    文章目录 一.联合体定义 二.联合体特点 三.大小端对联合体的影响 总结 一.联合体定义 联合也是一种特殊的自定义类型这种类型定义的变量也包含一系列的成员,特征是这些成员公用同一块空间(所以联合也叫共 ...

  5. C语言自定义类型详解

    C语言自定义类型详解 一.结构体 1.结构的声明 2.特殊的声明 3.结构的自引用 4.结构体变量的定义和初始化 5.结构体内存对齐 6.修改默认对齐数 7.结构体传参 二.位段 1.什么是位段 2. ...

  6. (转)C语言位运算详解

    地址:http://www.cnblogs.com/911/archive/2008/05/20/1203477.html C语言位运算详解 作者:911 说明:本文参考了http://www2.ts ...

  7. R语言基础知识详解及概括

    R语言基础知识详解及概括 目录 R语言基础知识详解及概括 R数据可视化示例 R语言进行数据创建

  8. c语言练习题及答案)(1),c语言练习题(带详解答案)1.pdf

    c语言练习题(带详解答案)1 (-2) -1: 一单项选择题 /为求商运算符,该运算符能够对整型.字符.浮点等类型的数 据进行运算,5/2 2 1.(A )是构成C语言程序的基本单位. 11.如果 i ...

  9. python语言的格式框架_django框架模板语言使用方法详解

    本文实例讲述了django框架模板语言使用方法.分享给大家供大家参考,具体如下: 模板功能 作用:生成html界面内容,模版致力于界面如何显示,而不是程序逻辑.模板不仅仅是一个html文件,还包括了页 ...

最新文章

  1. Pytorch - GPU ID 指定 pytorch gpu 指定
  2. [iOS]图片高清度太高, 导致内存过大Crash
  3. mysql执行动态批处理,使用BAT批处理执行sql语句的代码
  4. Vuex State模块化
  5. android ListView 刷新卡顿问题
  6. java settings文件夹_windows下打开.m2文件夹,没有找到setting.xml
  7. vue根据指令动态改变title名字
  8. 索尼申请“Pregius S”商标 或用于CMOS图像传感器
  9. windows 覆盖linux,您是否曾考虑过用Linux替换Windows?
  10. RedHat 设置IP、网关、DNS
  11. opencv基础:结构光立体成像原理及标定
  12. VB.NET控件应用编程实例教程(奋斗的小鸟)_PDF 电子书
  13. android drawtext换行_Android中用StaticLayout实现文本绘制自动换行详解
  14. jdk和cglib动态代理
  15. 【新知实验室TRTC】
  16. 公司申请高新认定需要有多少个软件著作权证书?
  17. 2.前端性能优化-web性能指标
  18. 整理任正非思想:要建立一个均衡的平台-1995
  19. 分分钟玩转multiprocessing多进程编程?
  20. 怎样实现在公众号文章下点击电话号码一键拨号

热门文章

  1. 最全的WebRTC服务器技术选型分析
  2. 公园安防建设:如何基于EasyCVR技术打造城市公园智能化视频监控?
  3. go-micro集成链路跟踪的方法和中间件原理
  4. GPRS无线数据传输系统介绍
  5. kernelutil.dll出错如何修复?kernelutil.dll下载地址
  6. AI英雄们,我们邀你向病理诊断和智能投顾发起挑战!| 人工智能创新创业大赛...
  7. 数云融合 | 旧叔讲文旅:数字化进程中功不可没的二维码
  8. 数学建模 --- 使用工具进行描述性统计
  9. 在一局域网里有两台PC,用IP地址互相ping不通,可能原因有哪些,尽可能多的列出。
  10. ENSP配置 实例十 ACL配置