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\n",sizeof(MyStruct),sizeof(MyUnion));
    
    printf("%p %p %p\n",&s.a,&s.b,&s.c);
    printf("%p %p %p\n",&u.a,&u.b,&u.c);
    
    //MyUnion u = {0x123456789};//这样初始化只初始化第一个成员
    u.c = 12345678;
    printf("%d %d %d\n",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\n",m.name);
    printf("%d\n",m.age);


    m.age = 23;
    printf("%s\n",m.name);
    printf("%d\n",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\n",sta[i].name);
        if(sta[i].job == 't') {
            printf("job:%s\n",sta[i].gOrp.position);
        }else {
            printf("job:%d\n",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("大端序!\n");
    }else {
        printf("小端序!\n");    
    }
}
//小端序!

枚举

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

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

转载于:https://www.cnblogs.com/intelwisd/p/8344124.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值