• 联合体,枚举类型


    联合体基本概念

     联合体也叫共同体,共用体,从外表看联合体与结构体长得很类似,结构体每一个成员都有自己独立的内存空间,但是联合体则共用同一片内存空间,也就是联合体同时只能允许一个变量存在。
     特点:
      1.联合体的内部是以堆叠的形式存在的;
      2.整个联合体的尺寸取决于,成员中尺寸最大的那个成员;
      3.给联合体成员赋值的时候只有最后一个是有效数据 (其他数据被践踏);
      4.联合体的成员之间是互相排斥的,在某一时刻只有一个成员有效。

    联合体的定义:

    union 联合体的标签 {
     
          成员1 ; 
          成员2 ; 
          成员3 ; 
          ...... ....
    }; 
    

     语法:
      联合体的标签:用来区分不同的联合体
      成 员:是指包含在联合体内的各个成员,可以是任意类型

    声明联合体

     typedef union my_union{
    
          int    a;
          double b;
          char   c;
    }my_uin, *p_my_uin;
    
    int main(int argc, char const *argv[])
    {   
          my_uin my_union1;    
          int size = sizeof(my_uin);     
          printf("%d
    " , size);          
          return 0;
    } 
    

    联合体操作

     联合体的操作与结构体没有差别,但是由于联合体的内存特性, 在赋值/初始化的时候,只有最后一个/第一个数据是有效数据。

    普通初始化

    //普通初始化只有第一个成员是有效的
    my_uin my_union1 = {100, 0.01, 'a'};  
    printf("my_union1.a:%d	 my_union1.b:%lf	 my_union1.c:%c
    ", my_union1.a, my_union1.b, my_union1.c);
    
    输出:my_union1.a:100  my_union1.b:0.000000    my_union1.c:d   //注意:my_union1.c输出的'd'是无效值,正确的值应该是'a'
    

    指定成员初始化

    //指定成员初始化只有最后一个成员是有效的
    my_uin my_union2 = {
    
          .a = 100,
          .b = 0.02,
          .c = 'b'
    };
    printf("my_union2.a:%d	 my_union2.b:%lf	 my_union2.c:%c
    ", my_union2.a, my_union2.b, my_union2.c);
    
    输出:my_union2.a:98   my_union2.b:0.000000    my_union2.c:b //注意:my_union2.a是无效值
    

    指定成员赋值

    my_uin my_union3;
    my_union3.a = 100;
    printf("my_union3.a: %d	 my_union3.b: %f	 my_union3.c:%c 
    ", my_union3.a, my_union3.b, my_union3.c); 
    my_union3.b = 0.03;
    printf("my_union3.a: %d	 my_union3.b: %f	 my_union3.c:%c 
    ", my_union3.a, my_union3.b, my_union3.c); 
    my_union3.c = 'c';
    printf("my_union3.a: %d	 my_union3.b: %f	 my_union3.c:%c 
    ", my_union3.a, my_union3.b, my_union3.c); 
        
    输出:
    my_union3.a:100        my_union3.b: 0.000000        my_union3.c:d 
    my_union3.a:-343597384 my_union3.b: 0.030000        my_union3.c:
    my_union3.a:-343597469 my_union3.b: 0.030000        my_union3.c:c 
    

    注意:
    联合体的成员之间是互相排斥的,在某一时刻只有一个成员有效,即使输出的值是正确的。

    共同体指针指定成员初始化

    //共同体指针指定成员初始化只有最后一个指定的是有效的
    p_my_uin p_my_union1 = NULL;
    p_my_union1 = (p_my_uin)calloc(1, sizeof(my_uin)); //注意,共同体指针需要给它指向一个空间,这个'空间的类型'是my_uin
    
    p_my_union1->a = 100;
    p_my_union1->b = 0.001;
    p_my_union1->c = 'c';
    printf("p_my_union1->a:%d	 p_my_union1->b:%lf	 p_my_union1->c:%c
    " ,p_my_union1->a, p_my_union1->b,  p_my_union1->c); 
    free(p_my_union1);
    p_my_union1 = NULL;
    
    输出:p_my_union1->a:-755914397       p_my_union1->b:0.001000         p_my_union1->c:c  //最后一个值才是有效
    

    联合体的使用

     联合体很少单独去使用,一般会与结构体一起使用, 用来表达某个互斥的属性.

    typedef struct my_struct{
    
          int a;
          float b;
          char c;
          my_uin my_union4; //注意my_uin,在上面的程序中已经声明了
    }my_str, *p_my_str;
    
    int main(int argc, char const *argv[])
    {
          my_str my_struct1 ;     
          my_struct1.my_union4.f = 345.123;     
          printf("my_struct1.my_union4.f: %lf
    ",my_struct1.my_union4.f);     
          return 0; 
    } 
    
    输出:my_struct1.my_union4.f: 345.123
    

    枚举类型

     枚举类型本质上是一个受限制的整型数据,比如我们用0-6 表示6个命令,0-3来表示4个状态......

    enum {
    
          枚举常量1,
          枚举常量2,
          枚举常量3,
           ....
    };
    

    注意:
    1.枚举常量本质上是整型,首个枚举常量默认是0;
    2.枚举常量在没有赋值的情况下,是前一个枚举常量的值+1;
    3.枚举常量可以接受赋值;
    4.枚举常量支持所有整形的操作。

  • 相关阅读:
    将文件读取到内存、打印pe结构
    DIV与IDIV的用法
    内存对齐与硬盘对齐
    逆向笔记013
    自己实现的字符串长度求取、复制、连接
    在一段内存中查找数据
    用Maven构建Mahout项目实现协同过滤ItemCF--集群版
    用Maven构建Mahout项目实现协同过滤userCF--单机版
    从源代码剖析Mahout推荐引擎
    推荐系统第2周--itemCF和userCF
  • 原文地址:https://www.cnblogs.com/ding-ding-light/p/14094268.html
Copyright © 2020-2023  润新知