目录
自定义类型:联合体(共用体)和枚举
1.自定义类型:联合体(共用体)
1.1 联合体的声明
1.2 联合体的特点
编辑1.3 联合体的大小计算
1.4使⽤联合体是可以节省空间的
1.5使用联合体写一个程序判断机器是大端还是小端存储
2.自定义类型:枚举
2.1枚举的声明
2.2 枚举变量的优点
自定义类型:联合体(共用体)和枚举
1.自定义类型:联合体(共用体)
联合体和结构体一样,可以又一个或者多个成员组成,成员也可以是不同的类型但是这些成员是共用一块空间的。
1.1 联合体的声明
union S
{char c;int i;
};int main()
{union S s = { 0 };s.c = 1;printf("s.i = %d\n", s.i); // 1printf("sizeof(s) = %zd\n", sizeof(s)); // 4return 0;
}
由于共用一块空间我们可以看到,我们赋值s.c,但是当我们打印s.i时依然是1。
由于共用一块空间我们可以看到, 计算整个联合体类型s时大小为4。
1.2 联合体的特点
联合的成员是共⽤同⼀块内存空间的,这样⼀个联合变量的⼤⼩,⾄少是最⼤成员的⼤⼩(因为联合⾄少得有能⼒保存最⼤的那个成员)。
union Un
{char c;int i;
};int main()
{union Un u = { 0 };printf("&(u.c) = %p\n", &(u.c));printf("&(u.i) = %p\n", &(u.i));printf("&u = %p\n", &u);return 0;
}
// 存储地址一样
union Un
{char c;int i;
};int main()
{union Un u = { 0 };u.i = 0x11223344;printf("u.i = %x\n", u.i);printf("u.c = %x\n", u.c);return 0;
}
// 小端存储,共用空间
1.3 联合体的大小计算
- 联合的⼤⼩⾄少是最⼤成员的⼤⼩。
- 当最⼤成员⼤⼩不是最⼤对⻬数的整数倍的时候,就要对⻬到最⼤对⻬数的整数倍。
#include <stdio.h>
union Un1
{ //大小 个数char c[10]; // 1 - 10int i; // 4 - 1
};
union Un2
{ // 大小 个数short c[3];// 2 - 3int i; // 4 - 1
};
int main()
{//下⾯输出的结果是什么?printf("%zd\n", sizeof(union Un1)); //12printf("%zd\n", sizeof(union Un2)); //8return 0;
}
1.4使⽤联合体是可以节省空间的
举例:
⽐如,我们要搞⼀个活动,要上线⼀个礼品兑换单,礼品兑换单中有三种商品:图书、杯⼦、衬衫。
每⼀种商品都有:库存量、价格、商品类型和商品类型相关的其他信息。
图书:书名、作者、⻚数
杯⼦:设计
衬衫:设计、可选颜⾊、可选尺⼨
struct gift_list
{// 公共属性int stock_number; //库存量double price; //价格int item_type; //商品类型union{struct {char title[20]; //书名char author[20]; //作者int num_pages; //页数}book;struct{char design[30];//设计}mug;struct{char design[30];//设计int colors;//颜色int size; //尺寸}shirt;}item;};
1.5使用联合体写一个程序判断机器是大端还是小端存储
int check()
{union U{char c;int i;};union U u = { 0 };u.i = 1;return (u.c);
}int main()
{int ret = check();if (ret == 1){printf("小端\n");}else{printf("大端\n");}return 0;
}
2.自定义类型:枚举
- 枚举顾名思义就是⼀⼀列举。
- 把可能的取值⼀⼀列举。
- ⽐如我们现实⽣活中:
- ⼀周的星期⼀到星期⽇是有限的7天,可以⼀⼀列举
- 性别有:男、⼥、保密,也可以⼀⼀列举
- ⽉份有12个⽉,也可以⼀⼀列举
- 三原⾊,也是可以意义列举
2.1枚举的声明
enum Colcor //颜色
{RED,BLUE,GREEN
};
// 枚举类型 - enum Colcor// RED,BLUE,GREEN 属于枚举变量//枚举变量的值默认从0开始,依次递增1,当然在声明枚举类型的时候也可以赋初值。
2.2 枚举变量的优点
枚举的优点:
1. 增加代码的可读性和可维护性
2. 和#define定义的标识符⽐较枚举有类型检查,更加严谨。
3. 便于调试,预处理阶段会删除 #define 定义的符号
4. 使⽤⽅便,⼀次可以定义多个常量
5. 枚举常量是遵循作⽤域规则的,枚举声明在函数内,只能在函数内使⽤
//题目://1.下面代码的结果是:
enum ENUM_A
{X1,Y1,Z1 = 255,A1,B1,
};
int main()
{enum ENUM_A enumA = Y1;enum ENUM_A enumB = B1;printf("enumA = %d\nenumB = %d\n", enumA, enumB);return 0;
}//因为枚举变量默认从0开始,X1=0,Y1=1,//但是Z1 = 255,所有后面从255开始数起, A1=256,B1=257。