文/Edward

共用体又称为联合体,它是C语言中的一种特殊的数据类型。它允许用户在相同的内存位置存储不同的数据类型。用户可以定义一个带有多成员的共用体,但是任何时候这些成员都共享同一块内存。举个例子,共用体的存储就好像是小孩子玩的太空沙,一块太空沙它的大小是固定的,有且只有这么多,而共用体内部的存储就好像一个又一个模具,你可以将这块太空沙分成两块放置到两个小一点的小熊模具里面,它就变成了两只小熊,也可以将它放到一块大一点的老虎模具里面,它就变成了一只老虎。因此,共用体的本质就是同一块内存的不同形式的访问。为了定义共用体,您必须使用 union 语句,方式与定义结构类似。union 语句定义了一个新的数据类型,带有多个成员。union 语句的格式如下:union 共用体标签(可缺省){      数据类型 成员变量1;      数据类型 成员变量2;      ……;} 共用体变量1,共用体变量2……;我们可以发现,其实共用体定义时候的形式和结构体如出一辙,只不过定义的关键词不一样。在定义时,共用体标签可以省略,联合体内部的成员变量数据类型是标准的变量定义,比如 int i; 或者 float f; 或者其他有效的变量定义,当然也可以是结构体。下面我们定义一个名为 Data 的共用体类型,它有三个成员 i、f 和 str,定义如下:union Data{   int i;   float f;   char  str[20];} data;现在,这个Data 类型的共用体可以存储一个整数、一个浮点数,或者一个字符串。这意味着一个变量(相同的内存位置)可以存储多个多种类型的数据。您可以根据需要在一个共用体内使用任何内置的或者用户自定义的数据类型。Data共用体的内存分别如图1所示。图1 共用体内存存储共用体占用的内存应足够存储共用体中最大的成员。例如,在上面的实例中,Data 将占用 20 个字节的内存空间,因为在各个成员中,字符串所占用的空间是最大的。共用体内部的成员变量访问和结构体一样,用“共用体.成员名”即可。下面的实例将显示上面的共用体占用的总内存大小,程序设计的思路为,我们去定义一个共用体,在里面存入不同的长度的变量,最后用sizeof去测量共用体,看看最后程序的输出,具体代码如图2所示。图2 测量共用体内存大小共用体说到底还是同一块内存空间的不同形式访问,你可以将这块内存以int类型去访问,也可以将这块内存以char数组的类型去访问。我们可以通过一个例子来说明上述的论点。论证的过程很简单,我们先定义一个共用体,在这个结构体里面定义两个变量,一个为“unsignedint”类型,一个为“char”类型数组。接着给unsigned int的变量赋值,最后将这两个变量都打印出来。如图3所示。图3 共用体同一块内存的不同形式访问我们之前说过,数组定义时,其内部的元素地址都是向上增长的,因此我们对共同体中的数组赋值后,再用一个四字节的无符号整形变量去访问,就可以得到组合到一起的数值了。一般来说,小端模式(高字节存储到高地址)的计算机会将高位地址的数组元素放在4字节无符号整数的高字节,低地址的数组元素,放在4字节无符号整数的低字节。大端模式(高字节存储到低地址)相反。利用这个原理,我们就可以判断计算机存储的大小端了。

共用体变量不能在定义时初始化_【C语言资料更新】共用体联合体相关推荐

  1. final变量要么定义时初始化,要么在代码块中初始化

    以上基于jdk1.8.final变量如果是静态的,要么定义时初始化,要么在静态代码块中初始化.final变量如果不是静态的,要么定义时初始化,要么在非静态代码块中初始化.  静态变量定义时初始化: 静 ...

  2. 【Struct(结构体)杂谈之二】名不正则言不顺---Struct(结构体)的声明、定义及初始化

    Struct(结构体)的声明.定义及初始化 上一篇里我们讲了为什么我们要引入Struct这个数据类型,我们了解到Struct是一种聚合数据类型,是为了用户描述和解释一些事物的方便而提出的,Struct ...

  3. C语言共用体中,共用体变量的规律

    运行以下代码,看一看输出的结果是什么? #include <stdio.h> int main(){union key{int k;char ch[2];}u;u.k = 258;prin ...

  4. python定义字符串数组初始化_字符数组及其定义和初始化,C语言字符数组详解...

    字符数组及其定义和初始化,C语言字符数组详解 字符串的存储方式有字符数组和字符指针,我们先来看看字符数组. 因为字符串是由多个字符组成的序列,所以要想存储一个字符串,可以先把它拆成一个个字符,然后分别 ...

  5. C语言结构体变量在定义时初始化

    C语言结构体变量在定义时就将其初始化的格式如下 struct struct_name struct_variable = {     .member1            = xxx,     .m ...

  6. 结构体变量的多种定义方式

    方式1:先定义类型,再定义变量(分开定义) 1.类型 struct Student { int age; double height; char *name; }; 2.变量 struct Stude ...

  7. 原 C语言之强大的结构体,【C语言资料更新】结构体的“卫浴”(位域)

    文/Edward 接下来再回到我们结构体的话题中来,我们之前讲结构体的时候,都是用int,char之类的数据类型来定义结构体的成员变量的,这些成员变量都有一个共性,就是他们的长度都是一个字节,或者一个 ...

  8. java list定义和初始化_在 Java 中初始化 List 的五种方法

    Java 中经常需要使用到 List,下面简单介绍几种常见的初始化方式. 1.构造 List 后使用 List.add 初始化 这是最常规的做法,用起来不太方便. 2.使用 {{}} 双括号语法 这种 ...

  9. 第九章、结构体与共用体

    文章目录 9.1 结构体变量定义.引用.初始化 9.1.1 结构体概述 9.1.2 定义结构体类型变量的方法 9.1.3 结构体类型变量的引用 9.1.4 结构体变量的初始化 9.2 结构体数组.结构 ...

最新文章

  1. java主动抛出400异常_400个线程同时查询数据,抛出一个异常
  2. 烂泥:net use与shutdown配合使用,本机重启远程服务器
  3. ctrlx不能剪切怎么回事_立式磨粉机产量越来越低是怎么回事?
  4. boost::fusion::make_fused用法的测试程序
  5. 字符串-拆分和拼接字符串
  6. 中止是怎么用的_多士炉怎么用 使用多士炉注意事项
  7. [转] 关于SQLSERVER2000卸载与出现挂起问题的解决
  8. call to member function bind_param() on boolean...........
  9. 农场管理系统设计与实现php,农场农产品网站的设计与实现(PHP,MySQL)(含录像)
  10. 使用 matlab 数字图像处理(二)—— 直方图均衡化(极简实现)
  11. Xcode C++ and Objective-C refactoring
  12. 用正则表达式去除标点符号
  13. java数据结构的面试题_Java面试题——数据结构篇(持续更新中)
  14. 直播平台开发时关于生成邀请码的开发
  15. 机房计算机组网方案,网络机房测试方案
  16. 图像算法之3D人脸识别技术原理概述
  17. Crash监控神器之腾讯Bugly
  18. 揭密巴西Banrisul银行网站遭遇5小时劫持的原因
  19. 全球5G市场最新进展及未来展望
  20. Linux 编译Aria2c最新版本

热门文章

  1. datetimepicker中文不生效_Python reStructuredText 帮助文件中文乱码
  2. 使用jsp页面查看jvm使用情况
  3. eclipse远程调试tomcat
  4. less最后一页 linux_必备linux命令有哪些?你了解多少
  5. mysql 5.6 emoji_让MySQL 5.6支持Emoji表情
  6. Feign Client 原理和使用
  7. 解决Android 输入法InputMethodService 显示时让原Activity大小计算错误问题
  8. Visual Studio 打开程序提示仅我的代码怎么办
  9. zookeeper在linux环境安装
  10. Selenium2+python自动化34-获取百度输入联想词