C语言系列(21)——联合体、枚举
一、什么是联合体(共用体)
联合体是一种特殊的数据类型,允许您在相同的内存位置存储不同的数据类型。
您可以定义一个带有多成员的共用体,但是任何时候只能有一个成员
带有值。
共用体提供了一种使用相同的内存位置的有效方式。
二、联合体定义
- 语法:
union
{
//成员1
//成员2
} 变量名;
- 定义1:
union
{
int a;//成员 a
float f;//成员 f
} data;//联合体变量,变量名为data
- 定义2:
union MyData
{
int a;//成员 a
float f;//成员 f
};//定义了一个联合体类型,为union MyData
union MyData data;//定义了一个MyData的联合体变量,变量名为data
- 定义3:
typedef union MyData
{
int a;//成员 a
float f;//成员 f
};//定义了一个联合体类型,为union MyData,重命名为MyData
MyData data;//定义了一个MyData的联合体变量,变量名为data
三、联合体的使用
使用 定义3 中定义的data
变量
//共享同一个内存地址
data.a = 10;//a赋值,会影响f的值
printf("%d, %f\n", data.a, data.f);
data.f = 10;//f赋值,会影响a的值
printf("%d, %f\n", data.a, data.f);
打印输出:
10
0.000000
1092616192
10.000000
以上示例,data.a
和 data.f
共用一段内存空间,给a赋值,则f同样受到影响;给f赋值则a的值也会变化。
- 大端小端
大端小端,实际上是指,数据存储在内存的顺序。
大端模式,是指数据的
高字节
保存在内存的低地址
中,而数据的低字节
保存在内存的高地址
中,这样的存储模式有点儿类似于把数据当作字符串顺序处理:地址由小向大增加,而数据从高位往低位放;这和我们的阅读习惯一致。
小端模式,是指数据的
高字节
保存在内存的高地址
中,而数据的低字节
保存在内存的低地址
中,这种存储模式将地址的高低和数据位权有效地结合起来,高地址部分权值高,低地址部分权值低。
数据1
在大端小端模式下的存储方式:
- 怎么判断内存中数据存储是大端模式还是小端模式?
typedef union
{
int a;
char c;
}MyUnion;
MyUnion u;
u.a = 1;
printf("%d, %d\n", u.a, u.c);
上述如果打印1则为小端
、如果打印0则为大端
。
四、枚举
是一个被命名的整型常数的集合。
枚举在日常生活中很常见,例如表示星期的SUNDAY、MONDAY、TUESDAY、WEDNESDAY、THURSDAY、FRIDAY、SATURDAY就是一个枚举。
- 枚举定义
typedef enum
{
SUNDAY,//默认值为0
MONDAY,//在上个值的基础上增1
TUESDAY,//以此类推
WEDNESDAY,
THURSDAY,
FRIDAY,
SATURDAY
}WEEK;
WEEK week = SUNDAY;//定义和赋值
- 例:
printf("%d, %d, %d\n", SUNDAY, MONDAY, FRIDAY); // 枚举被定义后,可以当做一个常量使用
switch (week)
{
case SUNDAY:
printf("星期天\n");
break;
case MONDAY:
printf("星期一\n");
break;
default:
break;
}
打印:
0, 1, 5
星期天