联合体
概念:也是一种复杂数据类型,用法和结构体几乎没有区别(唯一的不同时联合体中的所有成员共同使用一块空间——最大的成员变量大小的空间,而结构体每个成员都有自己的空间)
联合体的大小:通常情况下,联合体的大小就是最大成员的大小。
图示:以最大的成员变量的空间为最大。
但是也要考虑内存对齐对于联合体大小的影响,因此tmp_t类型最大对齐数是4,但是,char[5]占5个字节>4个字节,所以联合体大小应该是4的整数倍,因此是8.
union tmp_t
{
char name[5];
int age;
}
图示:
定义:
union student_t
{
int sn;
int age;
char sex;
double score;
};
联合体适用场景:
1.大小端的检测
大端:低地址存高位 小端:低地址存低位
例:0x00000001 大端:00 00 00 01 小端:01 00 00 00
union tmp_t
{
int a;
char b;
};
tmp_t tmp;
tmp.a = 1;
if(tmp.b == 1)
{
printf("小端");
}
(解释:因为联合体的所有成员共用同一块空间,所以a=1时,内存中存储的是01 00 00 00(小端)或者00 00 00 01(大端),这时,b占一个字节,所以在内存中b为01或者00,所以,如果b是01则说明该字节序是小端字节序,如果b是00则该字节序是大端字节序。)
2.在不同场景下适用不同的数据
当我们设计一个结构体时,一块空间会有多种数据访问方式,但是结构体定义出来是给别人用的,所以我们不知道用户会以什么方式来访问,因此在这种情况下定义联合体。多个成员共用一块空间,但是不同的成员对空间的访问方式不同。
例:同一块空间中的数据,使用的成员变量不同,则决定了不同的数据访问方式。
union tmp_t
{
int a;
double b;
void *c;
};
枚举
定义:
//宏
#define RED 0
#define BULE 1
#define GREEN 255
#define YELLOW 256
//枚举
enum color_t
{
RED,
BLUE,
GREEN=255,
YELLOW,
};
coldr_t叫枚举类型,RED,BLUE,GREEN,YELLOW这都叫枚举常量,本质上是数字,并且默认从0开始,自动向下+1。对上述代码来说,RED=0,BLUE=1,GREEN=255,YELLOW=256。
枚举相较于宏来说,多了类型校验,让代码更加严谨,调试也更加方便一些,枚举是一个整体定义在一个类型中,更便于代码的阅读理解;而宏则较为繁琐。