一、枚举
枚举就是一一列举的意思,生活中有些概念可以被我们人为一一列举出来,如:性别、三原色。性别不是男就是女、三原色为 rgb. 所以,C语言 提供了一种自定义类型的方法,称为 enum,即枚举。
程序清单1
#include <stdio.h>
enum SEX
{
MALE,
FEMALE
};
int main()
{
printf("%d\n", MALE);
printf("%d\n", FEMALE);
return 0;
}
// 输出结果:
// 0
// 1
程序清单2
#include <stdio.h>
enum COLOR
{
RED = 3, // 初始化枚举常量的值 √
GREEN,
BLUE
};
int main() {
// RED = 7; // 赋值 error
printf("%d\n", RED);
printf("%d\n", GREEN);
printf("%d\n", BLUE);
return 0;
}
// 输出结果:
// 3
// 4
// 5
程序清单3
#include <stdio.h>
enum COLOR
{
RED = 3, // 初始化 √
GREEN,
BLUE
};
int main() {
enum COLOR color1 = RED; // 创建一个枚举变量,拿枚举常量为其赋值
return 0;
}
注意事项:
创建一个枚举变量,最好拿枚举常量为其赋值,不要拿 3 进行赋值。因为枚举常量和枚举变量属于同类型,而拿上面的初始化 3 赋值时,3 是属于整型的数据,所以不规范。
其他的注意事项
① 注意枚举的写法,枚举大括号内的量称为枚举常量,不能被修改。
② 枚举常量的值默认是从 0 开始,依次向 1 2 3 … 递增。
③ 并不是所有东西都能够用枚举表示,例如一名学生的学年成绩,成绩是不具有规律性的,所以无法用枚举列出来。所以枚举只能在某些特定的场景中才能用到。
二、联合体
程序清单1
#include <stdio.h>
union Un {
char c; // 1
int i; // 4
};
int main() {
union Un u1;
printf("%d\n", sizeof(u1)); // 4
printf("%p\n", &u1);
printf("%p\n", &(u1.c));
printf("%p\n", &(u1.i));
return 0;
}
输出结果:
从上面的输出结果来看,我们可以得出结论: 联合体的所有成员共用一块内存空间,所以整个联合体所占内存的大小 >= 联合体最大成员的所占内存的大小。
程序清单2
#include <stdio.h>
#include <stddef.h>
union U
{
short c[7]; // 14
int i; // 4
};
int main() {
printf("%d\n", sizeof(union U)); // 16
printf("%u ", offsetof(union U, c)); // 0
printf("%u ", offsetof(union U, i)); // 0
return 0;
}
注意事项:
联合体也需要遵循内存对齐的规则,它和结构体的对齐规则相同。