联合(Union)
是一种构造数据类型,它提供了一种使不同类型数据类型成员之间共享存储空间的方法,同时可以实现不同类型数据成员之间的自动类型转换。联合体对象在同一时间只能存储一个成员的值。
联合的内存大小取决于其中字节数最多的成员,而不是累加,联合也会进行字长对齐。在定义联合变量的时候可以指定初始值,但是只能制定一个初始值(测试过似乎无法设置初值),而且该初始值的类型必须与联合的第一个成员的类型匹配。可以取一个联合变量的地址,也可以取变量中的任一个成员的地址,它们总是相等的。可以在同类型的联合变量之间赋值,但是不能比较两个联合变量的大小,不只是因为可能存在填补字节的问题,而且这两个变量可能是不同类型的成员,因此代表了两个类型不同的变量。

有这么几种定义联合体的方法:

1)标准方法


union a
{
    int b;
    char c;
};
a abc;
abc.b=4;
abc.c=5;
//或者也可以直接在定义时定义变量
union a
{
    int b;
    char c;
}abc;
abc.b=4;
abc.c=5;

2)使用typedef。这样相当于重新定义一个自定义类型,a作为类型名称。而不是如上面的变量名称。


typedef union
{
    int b;
    char c;
}a;
a abc;
abc.b=4;
abc.c=5;

3)不定义类型而只定义实例名称。这种方法用来局部使用union,而已在指定的某个作用域下使用。此时abc只是变量名称,而不是类型名称。


union
{
    int b;
    char c;
}abc;
abc.b=5;
abc.c=6;

4)匿名联合体(anonymous union),这种联合体比较特殊,它既不定义类型名称,也不定义变量名称。这种联合体只能作用在struct内部(原文说只能用在struct内部,我做测试也可以用在union内部 ,不过貌似这么做的意义不大),相当于结构的一个成员。


struct a
{
    int b;
    union
    {
        int c;
        char d;
    };
};
a abc;
abc.b=5;
abc.c=6;
abc.d=7;

这里有一种利用联合体来判断平台属性的简单程序,可以快速地判断平台是大端还是小端模式。如果函数返回0则表示平台是大端模式,否则是小端模式。


 1int CheckCPU(void)
 2{
 3    union w
 4    {
 5        int a;
 6        char b;
 7    }c;
 8    c.a = 1;
 9    return(c.b==1);
10}
 
结构(struct)
结构体的使用比较多,使用的方法和union类似,可以标准定义,可以用typedef定义别名。一般会采用typedef这样较规范的方法来定义结构体。也可以不定义类型名,只定义一个局部结构变量,从而使得该结构只在小范围内使用。
另外结构也有匿名结构(anonymous struct)的定义方法,但使用范围不广,C++并不支持匿名结构。它的使用正和union相反,必须放在union体内部才能使用。

union U {
  struct {
    int a;
    double b;
  };
  struct {
    char* c;
    unsigned d;
  };
};

枚举(Enum)
定义的一组特殊用途的符号常量,它表示这种类型的变量可以取值的范围。
定义枚举类型的时候,如果不特别指定其中的标示符的值,则第一个标示符的值将是0,后面的比前面的依次大1。如果指定了某一个标示符的值,后面的再前面的基础上依次大1。如
      enum Week{Sun, Mon=125, Tue, Wed, Thu=140, Fri, Sat};
其中的符号常量的值依次为:0, 125, 126, 127, 140, 141, 142。
也可以把某些枚举常量初始化为相等的常量,如
      enum ABC{A=1, B=1, C=100};
另外,枚举类型还可以是匿名的,即匿名枚举anonymous enum)。匿名的枚举类型就相当于直接定义的const符号常量,可以作为全局枚举,也可以放在任何类定义或名字空间中。
      enum
      {
            OBJECT_CREATIONG      =0x10;
            OBJECT_DELETIONG      =0x11;
            STATE_CHANGE              =0x12;
            ATTR_VALUE_CHANGE    =0x13;
      };
它可以取代宏常量和const符号常量。(以后看见这样的枚举类型就不会再觉得奇怪了)

结构struct 联合Union和枚举Enum的细节讨论的更多相关文章

  1. 【转】结构struct 联合Union和枚举Enum的细节讨论

    结构struct 联合Union和枚举Enum的细节讨论 联合(Union)是一种构造数据类型,它提供了一种使不同类型数据类型成员之间共享存储空间的方法,同时可以实现不同类型数据成员之间的自动类型转换 ...

  2. C语言学习015:联合(union)与枚举(enum)

    联合 联合和结构的区别是,结构会为每个字段申请一片内存空间,而联合只是申请了一片内存空间然后所有字段都会保存到这片空间中,这片空间的大小由字段中最长的决定,下面我们就开始定义一个联合 //联合的定义 ...

  3. C和C++中结构体(struct)、联合体(union)、枚举(enum)的区别

    C++对C语言的结构.联合.枚举 这3种数据类型进行了扩展. 1.C++定义的结构名.联合名.枚举名 都是 类型名,可以直接用于变量的声明或定义.即在C++中定义变量时不必在结构名.联合名.枚举名 前 ...

  4. 结构体struct、联合体union、枚举类型enum

    1.c语言中的类型 1)内置类型——char,short,int,float,double: 2)用户自定义类型(UDT)——struct结构体,union联合体,enum枚举类型 2.内存对齐 2. ...

  5. 结构体struct 与 联合union

    1.C语言中的结构体 1.1 定义 结构体是由一系列相同或不同类型的变量组成的集合. struct 结构体名{               //struct为关键字,“结构体名”为用户定义的类型标识. ...

  6. 【UE4 C++ 基础知识】<4> 枚举 Enum、结构体 Struct

    枚举 UENUM宏搭配BlueprintType可以将枚举暴露给蓝图,不使用的话,仅能在C++使用 //定义一个原生enum class enum class EMyType { Type1, Typ ...

  7. C语言中结构、联合、枚举的说明

    复杂的数据类型 一般的步骤: 1.声明模板 2.定义变量,分配内存空间 3.初始化 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ...

  8. C++ | C++ 基础知识 | 结构、联合与枚举

    1. 结构 1.0 结构 数组是相同类型元素的集合,相反,struct 是任意类型元素的集合. 代码例子: struct Address { const char* name; int number; ...

  9. SQL SERVER 2012 第四章 连接 JOIN语句的早期语法结构 & 联合UNION

    1/内部连接的早期语法结构 INNER JOIN SELECT * FROM Person.Person JOIN HumanResources.Employee ON Person.Person.I ...

随机推荐

  1. C# WPF发票打印

    微信公众号:Dotnet9,网站:Dotnet9.问题或建议,请网站留言: 如果您觉得Dotnet9对您有帮助,欢迎赞赏 C# WPF发票打印 内容目录 实现效果 业务场景 编码实现 本文参考 源码下 ...

  2. Jquery实现挂号平台首页源码2

    第二个版本:点击预约挂号可跳转到排班表,获取之后7个星期的排班 先放图 首先是index.html <!DOCTYPE html> <html lang="en" ...

  3. WSL Ubuntu 安装MongoDb 4.0导入公钥时遇到一个坑 (转)

    WSL Ubuntu 安装MongoDb 4.0导入公钥时遇到一个坑 一路坑啊~~~网上的密钥都不对????  不应该啊 源中默认是MongoDb 3.x 但是我想用4.0,然后按照mongodb官方 ...

  4. gulp常用插件之gulp-load-plugins使用

    更多gulp常用插件使用请访问:gulp常用插件汇总 gulp-load-plugins这是一款批量引入package.json文件中的依赖项工具. 更多使用文档请点击访问gulp-load-plug ...

  5. the simmon effect(in psychology) :build the function of subject_information(modify the experiment programme),before we begin the experiment

    #the real experiment for simon effect #load the library which is our need import pygame import sys i ...

  6. [CF1303G] Sum of Prefix Sums - 点分治,李超线段树

    给定一棵 \(n\) 个点的带点权的树,求树上的路径 \(x_1,...,x_k\) ,最大化 \(\sum_{i=1}^k ia_{x_i}\) Solution 树上路径问题可用点分治. 考虑如何 ...

  7. Selenium3+python自动化016-多线程

    1.进程 什么是进程? 进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础.在早期面向进程设计的计算机结构中,进程是程序的基 ...

  8. CSS 实现一个自适应的正方形

      传统方法正方形用固定的形式写 直接长=宽写固定的值如下   .box{   width: 200px;   height: 200px;   background: pink;   color: ...

  9. 我的第一个原生Web Components——滑块(SingleSlider)

    写着写着,就会跑偏,没错又走上了一个岔道……就是不知道这条岔道以后会不会越来越宽,有的说他是未来,有的说…… 这里不知道,也不做什么评断.减少一些重复性的工作,提高开发效率这是最根本的.说白了就是偷懒 ...

  10. ECMAScript基本对象——Boolean对象

    1.创建 var myBoolean=new Boolean(); 2.方法 toString()把布尔值转换为字符串,并返回结果 valueOf()返回 Boolean 对象的原始值. 3.属性 1 ...