zoukankan      html  css  js  c++  java
  • 结构struct 联合Union和枚举Enum的细节讨论

    联合(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符号常量。(以后看见这样的枚举类型就不会再觉得奇怪了)

  • 相关阅读:
    洛谷P5979 [PA2014]Druzyny
    洛谷P5592 美德的讲坛
    BZOJ4231 回忆树
    Python爬虫〇二———从几个简单的爬虫开始
    Flink实例(115):自定义时间和窗口的操作符(十四)窗口操作符(四)触发器(Triggers) (二)
    商业化数据分析师(三十二):平台商品画像实战项目(三)购物篮分析
    商业化数据分析师(三十一):平台商品画像实战项目(二)如何构建商品画像-- 以移动电源为例
    商业化数据分析师(三十):平台商品画像实战项目(一)简介
    商业化数据分析师(二十九):平台用户画像实战项目(二)如何构建平台用户的用户画像
    商业化数据分析师(二十八):平台用户画像实战项目(一)什么是用户画像体系以及商户用户画像和平台用户画像的区别
  • 原文地址:https://www.cnblogs.com/yzl050819/p/7216435.html
Copyright © 2011-2022 走看看