0x01 联合

联合可以用来创建新的数据类型,联合的成员变量对应的存储区是互相重叠
联合存储区的大小是”最大存储区的大小”
联合存储区可以当作多种不同类型的存储区使用,每个成员变量代表一种对应的类型,这一点和结构体有点相似
联合的所有成员变量存储区的开始地址一样,联合中所有成员分配的是同一块内存
声明联合的时候需要使用 union 关键字(使用 typedef 关键字和结构体一样)

1
2
3
4
5
6
7
8
9
10
11
12
13
#include <stdio.h>
typedef union /* tmp */{
int num; //最大存储区,占4个字节
float fnum;
char buf[2];
}tmp;
int main(){
tmp p = {0};
printf("&(p.num)是%p\n", &(p.num)); //0xbfc6da34
printf("&(p.fnum)是%p\n", &(p.fnum)); //0xbfc6da34
printf("sizeof(tmp)是%d\n", sizeof(tmp)); //4
return 0;
}

0x02 枚举

枚举类型的存储区为整数类型的存储区,只能存放有限的几个整数
声明枚举类型需要提供几个名称、计算机为每个名称分配一个整数,只有整数才能记录到枚举类型的存储区里
声明时需要使用到 enum 关键字
在不赋值的情况下,计算机会给枚举的第一个名称分配为 0 ,向后依次递增
也可以在在声明枚举类型的时候指定某个名称对应的整数,这个名称后面的对应名称的整数也会随之发生变化

1
2
3
4
5
6
7
8
9
10
//demo
#include "stdio.h"
enum /*season*/{CHUN,XIA = 5,QIU,DONG};
int main(){
printf("CHUN == %d\n",CHUN); //0
printf("XIA == %d\n",XIA); //5
printf("QIU == %d\n",QIU); //6
printf("DONG == %d\n",DONG); //7
return 0;
}