zoukankan      html  css  js  c++  java
  • C/C++(共用体与枚举)

    共用(Union)与枚举(Enum)

    共同体

    c语言中,不同的成员使用共同的存储区域的数据结构类型称为共用体。(共用,联合体),共用体在定义,说明,适用形式上与结构体相似。两者本质上的不同在于使用内存的方式上。
    定义:

    union unionName{
        成员列表;
    };
    

    大小:对于结构体不考虑内存对齐,其大小是各成员之和。对于共同体,成员中最大的元素所占用的空间大小。
    成员地址:结构体每个成员均有自己独立的地址。共用体而言,所有的策划给你元独有一个地址。

    typedef struct _structTest{
        char a;
        short b;
        int c;
    }MyStruct;
    typedef union _unionTest{
        char a;
        short b;
        int c;
    }MyUnion;
    int main() {
        MyStruct s;
        MyUnion u;
        printf("sizeof(struct) = %d sizeof(union) = %d
    ",sizeof(MyStruct),sizeof(MyUnion));
        
        printf("%p %p %p
    ",&s.a,&s.b,&s.c);
        printf("%p %p %p
    ",&u.a,&u.b,&u.c);
        
        //MyUnion u = {0x123456789};//这样初始化只初始化第一个成员
        u.c = 12345678;
        printf("%d %d %d
    ",u.a,u.b,u.c);
        
        return 0;
    }
    //sizeof(struct) = 8 sizeof(union) = 4
    /*
    0061FEA8 0061FEAA 0061FEAC
    0061FEA4 0061FEA4 0061FEA4
    */
    //78 24910 12345678
    
    

    成员共享具有瞬时共享性。

    typedef union _mix{
        char name[10];
        int age;
    }Mix;
    int main() {
        Mix m;
        strcpy(m.name,"assassin");
        printf("%s
    ",m.name);
        printf("%d
    ",m.age);
    
    
        m.age = 23;
        printf("%s
    ",m.name);
        printf("%d
    ",m.age);
    
        return 0;
    }
    /*
    assassin
    1634956129 无意义的数字
     无意义的数据
    23
    */
    

    共用体总结:

    共用体变量的地址和它的各个成员的地址都是同一地址。
    同一个内存段可以用来存放几种不同类型的成员,但是每一瞬间只能存放其中的一种,而不是同时存放几种。
    共用体变量中起作用的成员是最后一次存放的成员,在存入一个新的成员后有的成员就是去作用。
    共用体类型可以出现在结构体类型定义中,也可以定义共用体数组。反之,结构体也可以出现在共用体类型定义中,数组也可以作为共用体的成员。

    typedef struct _staff{
        char name[30];
        char job;
        union{
            int grade;
            char position[50];
        }gOrp;
    }Staff;
    int main() {
        Staff sta[2];
        for(int i =0;i < 2;i++) {
            printf("name:");
            scanf("%s",sta[i].name);
            getcchar();//
            printf("job:");
            scanf("%c",&sta[i].jpb);
            if(sta[i].job == 't') {
                printf("position:");
                scanf("%s",sta[i].gOrp.position);
            }else {
                printf("grade:");
                scanf("%d",&sta[i].gOrp.grade);
            }
        }
        for(int i = 0;i < 2;i++) {
            printf("name:%s
    ",sta[i].name);
            if(sta[i].job == 't') {
                printf("job:%s
    ",sta[i].gOrp.position);
            }else {
                printf("job:%d
    ",sta[i].gOrp.grade);            
            }
        }
    
    }
    
    /*
    name:assassin
    job:t
    position:pro
    name:seafwg
    job:s
    grade:99
    name:assassin
    job:pro
    name:seafwg
    job:99
    */
    

    小端序与大端序

    union高地址放的小地址---小端序
    union高地址放的大地址---大端序
    用程序判断:大小端序:

    union _un{
        char c;
        int i;
    }un;
    int main() {
        un.i = 0x12345678;
        if(un.c == 0x12) {
            printf("大端序!
    ");
        }else {
            printf("小端序!
    ");    
        }
    }
    //小端序!
    
    

    枚举

    枚举定义了一组整型常量的集合,目的可读性,语法跟结构体相同。
    定义:

    enum 枚举类型
    {
        常量列表;
    };
    
    //提供了一组常量的别名,以便程序的清晰可读
    enum Day{
        Mon = 1,Tue,Wed,Thu,Fri,Sat,Sun
            //要是不赋值,从0开始,赋值后的成员依次加一。
    };
    int main() {
        enum Day day;
        printf("please input day!
    ");
        scanf("%d",&day);
        switch(day) {
            case Mon:
            case Tue:
            case Wed:
            case Thu:
            case Fri:
                printf("workday!
    ");
                break;
            case Sat:
            case Sun:
                printf("holiday!
    ");
                break;
        }
    }
    

    枚举与宏定义联系:

    #define Mon 1 
    #define Tue 2 
    #define Wed 3 
    #define Thu 4 
    #define Fri 5 
    #define Sat 6 
    #define Sun 7 
    //<=> 类似与上述的宏定义,通常用enum来定义统一管理:
    enum Day{
        Mon = 1,Tue,Wed,Thu,Fri,Sat,Sun
    };
    

    常见应用:

    typedef enum _bool{
        False,True
    }Bool;
    int main() {
        Bool flag;
        flag = False;
        if(!flag) {
            printf("0
    ");
        }else{
            printf("1
    ");
        }
    }
    
  • 相关阅读:
    KUDU 介绍
    Redis是什么?什么作用?优点和缺点
    数据库的种类有哪些?
    oracle 存储过程之游标(loop)使用
    JsHelper.cs
    MsSqlHelper.cs
    PLSQL操作Oracle创建用户和表(含创建用户名和密码)
    ASP.NET开发--三层架构
    oracle数据库之数据插入、修改和删除
    IDEA 搭建SSM框架详细教程以及token本地运行环境常遇到的问题
  • 原文地址:https://www.cnblogs.com/intelwisd/p/8344124.html
Copyright © 2011-2022 走看看