共用(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");
}
}