联合是由存储重叠的成员序列组成的类型(与结构相对,结构是一种由存储按有序序列分配的成员序列组成的类型)。至多一个成员的价值可以在任何时候存储在工会中。

struct除了使用的关键字之外,联合的类型说明符与   类型说明符相同:

句法

联合体名称(可选){结构声明列表}(1)工会名称(2)

name-正在定义的联盟的名称结构声明列表-任何数量的变量声明,位域声明和静态断言声明。不完整类型的成员和函数类型的成员是不允许的。

说明

工会的规模只有持有其最大成员所需的那么大(另外还可以添加未命名的追尾填充)。其他成员以相同字节分配,作为该最大成员的一部分。

指向联合的指针可以转换为指向其每个成员的指针(如果联合有位字段成员,指向联合的指针可以转换为指向位字段的基础类型的指针)。同样,可以将指向任何联合成员的指针转换为指向包围联合的指针。

如果用于访问联合的内容的成员与上次用于存储值的成员不相同,则存储的值的对象表示将被重新解释为新类型的对象表示(这称为类型打孔)。如果新类型的大小大于最后写入类型的大小,则超出字节的内容未指定(并且可能是陷阱表示)。

与struct类似,类型为无名称的联合的联合的未命名成员称为匿名联合。匿名联盟的每个成员都被认为是封闭结构或联盟的成员。如果封闭的结构或联合也是匿名的,则这将递归应用。struct v {union {//匿名联合结构{int i,j; }; //匿名结构struct {long k,l; } w; }; int m; } v1; v1.i = 2; //有效v1.k = 3; //无效:内部结构不是匿名的v1.wk = 5; // valid类似于struct,如果union没有任何命名成员(包括通过匿名嵌套结构或联合获得的)定义,则程序的行为是未定义的。(自C11以来)

关键词

union.

笔记

有关结构和联合初始化的规则,请参阅结构初始化。

#include #include #include

int main(void){

union S {

uint32_t u32;

uint16_t u16[2];

uint8_t  u8;    } s = {0x12345678}; // s.u32 is now the active member    printf("Union S has size %zu and holds %x\n", sizeof s, s.u32);

s.u16[0] = 0x0011;  // s.u16 is now the active member    // reading from s.u32 or from s.u8 reinterprets the object representation//  printf("s.u8 is now %x\n", s.u8); // unspecified, typically 11 or 00//  printf("s.u32 is now %x\n", s.u32); // unspecified, typically 12340011 or 00115678

// pointers to all members of a union compare equal to themselves and the union    assert((uint8_t*)&s == &s.u8);

// this union has 3 bytes of trailing padding

union pad {

char  c[5];   // occupies 5 bytes

float f;      // occupies 4 bytes, imposes alignment 4    } p = {.f = 1.23}; // the size is 8 to satisfy float's alignment    printf("size of union of char[5] and float is %zu\n", sizeof p);}

输出:

Union S has size 4 and holds 12345678size of union of char[5] and float is 8

每个成员都被分配好像它是唯一的成员,这就是为什么s.c在上面的例子中第一个字节是别名s.s[0]。

参考

C11标准(ISO / IEC 9899:2011):6.7.2.1结构和联合说明符(p:112-117)

C99标准(ISO / IEC 9899:1999):6.7.2.1结构和联合说明符(p:101-104)

C89 / C90标准(ISO / IEC 9899:1990):3.5.2.1结构和联合说明符

union c语言大小,Union declaration(联合体声明)相关推荐

  1. 联合体c语言指针,C++中联合体(union)的使用

    typedef union para { double tmp[]; struct { double a; double b; double c; double d; }NP; }NPara; //或 ...

  2. union在c语言中的作用,c语言联合union的使用用途

    在使用联合的使用,我们通常用来判断大小端,但是其实不仅仅有这个用处. 我在网上看到还有其他的用途: 1.分离高低字节 这个需要结合cpu大小端来判断,原文如下: 这样的操作,而一个除法消耗四个机器周期 ...

  3. C语言之union共同体

    C语言之union共同体 文章链接 知识点 union共同体的定义: union空间长度的分配: 共同体个变量相互影响及原因: union的使用样例: 新名词记录{union共同体:Unicode:} ...

  4. C++ 语言命名空间 (namespace) 和 using 声明 (using declaration)

    C++ 语言命名空间 (namespace) 和 using 声明 (using declaration) 命名空间可作为附加信息来区分不同库中相同名称的函数.类.变量等.命名空间定义了上下文,就是定 ...

  5. Xamarin XAML语言教程对象元素的声明方式

    Xamarin XAML语言教程对象元素的声明方式 XAML的对象元素的声明有两种形式,分别为包含属性的特性语法形式以及对象元素语法形式.在1.4小节中,我们看到了其中一种对XAML对象元素的声明方式 ...

  6. C语言结构体与联合体

    c语言结构体与联合体 结构类型定义和结构变量说明 一.结构的定义 二.结构类型变量的说明 结构变量的赋值 结构变量的初始化 结构数组 结构指针变量 其访问的一般形式为: (*结构指针变量).成员名 结 ...

  7. mysql union all 别名_mysql union和union all

    如下先创建2个表,aa bb. CREATE table aa( uid int(20) not null, name VARCHAR(30) not null )engine=innodb defa ...

  8. c语言100位整数变量声明_C ++程序动态声明一个整数变量并打印其内存地址

    c语言100位整数变量声明 Here, we will learn how we can declare an integer variable dynamically and how to prin ...

  9. mysql union all 别名_mysql union 与 union all 语法及用法

    1.mysql   union  语法 mysql   union 用于把来自多个select  语句的结果组合到一个结果集合中.语法为: select  column,......from tabl ...

最新文章

  1. MYSQL 的 MASTER到MASTER的主主循环同步
  2. gis影像格式img转为ecw_微图影像地图导出拼接大图的参数说明
  3. 创建可调试,热加载的TypeScript+Koa工程
  4. springboot md5加密_SpringSecurity入门-SpringBoot集成SpringSecurity
  5. 已达成计算机的连接数最大值无法再,已达到计算机的连接数最大值,无法再同此远程计算机连接...
  6. 【LeetCode】查找只出现一次的数字算法
  7. 解决用Python对Sqlite进行数据更新比较慢的一种方法
  8. java中怎么打开标尺_PageOffice如何显示/隐藏Word文档中的标尺
  9. python 进位_蓝桥杯-Python-高精度加法
  10. 使用ENVI5.3构建时序数据展示
  11. 2022G3锅炉水处理复训题库及答案
  12. 初学者怎样快速学会 SQL
  13. 5.9 Illustrator颜色的设置 [Illustrator CC教程]
  14. ASP.NET Core 中文文档目录
  15. vue第五天笔记02——vuex数据仓库
  16. 【Flex】“安装的AdobeFlashPlayer不是调试器”解决办法之详解
  17. 二线城市疯狂抢人,技术人才何去何从?
  18. 公司新来了个软件测试工程师,一副毛头小子的样儿,哪想到是新一代卷王...
  19. 四位共阳极数码管显示函数_求各位大神指正,四位一体共阳极数码管数字钟程序,仿真能运行,实物就只显8个8,不动...
  20. C/C++中int的取值范围

热门文章

  1. redis常用监控命令
  2. python实现合并两个文件并打印输出
  3. MyEclipse 9.0的激活机制
  4. iframe的onload在Chrome/Opera中执行两次Bug
  5. Linux2.6内核本地提权
  6. 解析Java对象引用与JVM自动内存管理(2)
  7. SpringBoot第八篇:整合MyBatis-Generator
  8. Java EE体系概述
  9. 通用easyui查询页面组件
  10. 2015-11-16