单单从union的字母意思上翻译的话,联合是最容易让人想到的,但是这往往会让人产生疑惑?所以感觉这个中文翻译并不好,反而是共用体(union)能体现出这种类型的含义。

下面转载一篇介绍共用体的文章,写的简直清晰易懂!

http://www.runoob.com/cprogramming/c-unions.html


共用体是一种特殊的数据类型,允许您在相同的内存位置存储不同的数据类型。您可以定义一个带有多成员的共用体,但是任何时候只能有一个成员带有值。共用体提供了一种使用相同的内存位置的有效方式。

定义共用体

为了定义共用体,您必须使用 union 语句,方式与定义结构类似。union 语句定义了一个新的数据类型,带有多个成员。union 语句的格式如下:

union [union tag] {member definition; member definition;... member definition;}  [one or more union variables];

union tag 是可选的,每个 member definition 是标准的变量定义,比如 int i; 或者 float f; 或者其他有效的变量定义。在共用体定义的末尾,最后一个分号之前,您可以指定一个或多个共用体变量,这是可选的。下面定义一个名为 Data 的共用体类型,有三个成员 i、f 和 str:

union Data{ int i; float f;char str[20]; } data;

现在,Data 类型的变量可以存储一个整数、一个浮点数,或者一个字符串。这意味着一个变量(相同的内存位置)可以存储多个多种类型的数据。您可以根据需要在一个共用体内使用任何内置的或者用户自定义的数据类型。

共用体占用的内存应足够存储共用体中最大的成员。例如,在上面的实例中,Data 将占用 20 个字节的内存空间,因为在各个成员中,字符串所占用的空间是最大的。下面的实例将显示上面的共用体占用的总内存大小:

实例

#include <stdio.h> #include <string.h> union Data {int i;float f;char str[20]; };int main( ) { union Data data; printf( "Memory size occupied by data : %d\n", sizeof(data)); return 0;}

当上面的代码被编译和执行时,它会产生下列结果:

Memory size occupied by data : 20

访问共用体成员

为了访问共用体的成员,我们使用成员访问运算符(.)。成员访问运算符是共用体变量名称和我们要访问的共用体成员之间的一个句号。您可以使用 union 关键字来定义共用体类型的变量。下面的实例演示了共用体的用法:

实例

#include <stdio.h>
#include <string.h>
union Data
{ int i; float f; char str[20];
};
int main( )
{ union Data data; data.i = 10; data.f = 220.5; strcpy( data.str, "C Programming"); printf( "data.i : %d\n", data.i); printf( "data.f : %f\n", data.f); printf( "data.str : %s\n", data.str); return 0;
}

当上面的代码被编译和执行时,它会产生下列结果:

data.i : 1917853763
data.f : 4122360580327794860452759994368.000000
data.str : C Programming

这个例子只是一个反面教材,共用体当然不能这么用,如果是这么用的话,基本可以告别使用共用体了。

在这里,我们可以看到共用体的 i 和 f 成员的值有损坏,因为最后赋给变量的值占用了内存位置,这也是 str 成员能够完好输出的原因。现在让我们再来看一个相同的实例,这次我们在同一时间只使用一个变量,这也演示了使用共用体的主要目的:

实例

#include <stdio.h>
#include <string.h>
union Data { int i; float f; char str[20];
};
int main( )
{ union Data data; data.i = 10; printf( "data.i : %d\n", data.i); data.f = 220.5; printf( "data.f : %f\n", data.f); strcpy( data.str, "C Programming");printf( "data.str : %s\n", data.str); return 0;
}

当上面的代码被编译和执行时,它会产生下列结果:

data.i : 10
data.f : 220.500000
data.str : C Programming

在这里,所有的成员都能完好输出,因为同一时间只用到一个成员。

【 C 】联合(union)或共用体(union)相关推荐

  1. C复合结构——共用体union

    文章目录: 一:概念 二: 定义共用体类型变量的一般形式 三: 共用体和结构体的比较 四: 共用体变量的引用方式 C语言--共用体 变量是一个一个定义的 数组是一组具有相同类型的变量的集合 struc ...

  2. C语言联合体/共用体/union,枚举使用大全

    文章目录 一.前言 二.联合体 1.联合体基础 2. 联合体的使用方法和使用场景 2.1 多种访问内存途径共存 2.2 联合体union和大小端(big-endian.little-endian) 2 ...

  3. 联合体(共用体) union 的深入理解

    1.联合类型的定义: 联合也是一种特殊的自定义类型 这种类型定义的变量也包含一系列的成员,特征是这些成员公用同一块空间(所以联合也叫共用体). //联合类型的声明 union Un { char c; ...

  4. C++ 共用体union 的使用

    共用体是什么 共用体将不同的数据类型组织为一个整体, 需要注意的是,共用体在同一时刻只能存储一个数据成员的值., 共用体变量的地址和它的格式成员的地址都是同一地址 共用体的一般形式 union 共用体 ...

  5. 【c语言基础必备】共用体union

    共用体是C 语言的另外一种构造类型,与前面介绍的结构体类似.共用体也由基本数据结构组合而成,但是共用体和结构体却有本质区别,因为结构体中的每个成员都占用存储单元,所以结构体所占用的内存大小为所有成员各 ...

  6. c语言联合有什么作用,C语言union共用体(联合体)基础知识及实际用途

    union我想应该不是为了省内存而创建的吧!能省多少内存呢? 我猜测是:一个空间可以同时使用多种类型,而不必在意数据类型,因为我们可以通过里面的数值判断数据类型.(可参考动态语言Lua/Python) ...

  7. c语言结构体加联合,C语言:结构体和联合体(共用体)

    结构体:struct 1.结构体变量的首地址能够被其最宽基本类型成员的大小所整除. 2.结构体每个成员相对于结构体首地址的偏移量(offset)都是成员的整数倍. 3.结构体的总大小为结构体最宽基本类 ...

  8. 结构体与共用体(联合体)

    参考:结构体与共用体 作者:一只青木呀 发布时间: 2020-08-09 08:29:22 网址:https://blog.csdn.net/weixin_45309916/article/detai ...

  9. 字符串类型、结构体、共用体、枚举、container宏、内存来源

    一.C语言的字符串类型 1.C语言没有原生字符串类型 很多高级语言像java.C#等就有字符串类型,有个String来表示字符串,用法和int这些很像,可以String s1 = "linu ...

  10. 共用体知识及 I - 共用体练习

    一.共用体 Union的定义格式为: union 共用体名{ 成员列表 }; 例如: union data{int x;char y;double z; }; union data a, b, c; ...

最新文章

  1. jq处理 php数组,jQuery数组处理方法汇总_jquery
  2. 修改服务器里的端口,怎么修改windows服务器登陆端口号
  3. 综合布线系统设计遵循的标准和条件
  4. JframeMaxSize
  5. adb push和pull使用
  6. Spark streaming vs JStorm
  7. Contains Duplicate --包含相同值
  8. 主设备号与次设备号以及申请
  9. python可变参数和关键字参数位置_python笔记——函数的参数(位置参数、默认参数、可变参数、关键字参数、命名关键字参数、参数组合)...
  10. 7-104 6翻了 (15 分)
  11. 信号与槽是如何实现的_如何解决wifi信号不好,实现全面覆盖
  12. 服务器系统重置,云服务器系统重置
  13. 亿级流量背后战场,京东11.11大促全方位技术揭秘
  14. CSS侦测方法(侦测是否支持某个CSS属性)
  15. 架构 - 洋葱图架构
  16. C++ 类的封装继承多态
  17. Ant UI 的表单校验
  18. 小米笔记本桌面没有计算机,没有4K屏幕,只有3.5K,小米笔记本真好用吗?
  19. 服务器返回的常见http状态码
  20. AlphaGo与蒙特卡罗树搜索

热门文章

  1. css设置标题边框,css 如何让文字标题显示在边框上?
  2. 电脑台式计算机描述不可用,win7系统计算机描述不可用的解决方法
  3. linux文件系统的链接,用户指南:Linux文件系统的链接
  4. android 8.0 l2tp问题,【Win】使用L2TP出現809錯誤
  5. shardingjdbc全局表_sharding-jdbc实现按年分库按月分表
  6. it转正述职报告_普通员工转正述职报告范文
  7. 一组基于OpenCV的图像处理函数
  8. Paddle 网络中的Tensor 数据结构
  9. 智能车竞赛技术报告 | 单车拉力组 - 哈尔滨工业大学 - 紫丁香
  10. 基于ESP32的竞赛裁判系统功能调试-硬件修改建议