目录
1.联合体类型的声明
1.1联合体类型声明
2.联合体的特点
3.联合体大小的计算
3.1计算规则:
3.2运用联合体实现大小端判断
4.枚举类型的声明
5.枚举类型的优点
6.枚举类型的使用
与结构体相似,联合体也是由一个及以上的成员组成,成员可以是不同类型的数据;但与结构体不同的是,编译器只给最大的成员分配足够的内存空间,即所有成员共用一块内存空间,所以联合体也叫做共用体。
联合体的声明与结构体也类似,即使用union来声明:
union U
{
char c;
int i;
};
共用了一块内存,显而易见给其中一个成员赋值,其他成员的值也会跟着改变。比如:
#include
union U
{
char c;
int i;
};
int main()
{
union U a = { 0 };
a.c = 1;
printf("%d\n", a.c);
printf("%d\n", a.i);
printf("%zu\n", sizeof(union U));
return 0;
}
改变了a.c,因为共用同一块内存所以也改变了a.i,那么该联合体的大小为什么是4呢?
既然联合体的成员共用同一块内存,那么这个联合体至少要保证最大的成员,所以联合体的大小至少是最大成员的大小。
比如上面的联合体U:
我们再以相同成员的结合体类型比较一下:
struct U
{
char c;
int i;
};
(如果忘记结构体相关知识可以移步http://t.csdnimg.cn/4a1Dx)
1.联合体大小至少是最大成员的大小
2.当最大成员大小不是最大对齐数的整数倍时,就要对齐到最大整数倍。
比如:
#include
union un
{
int i;
char j[9];
};
union un2
{
int i;
char j[7];
};
int main()
{
printf("%zu\n", sizeof(union un));
printf("%zu\n", sizeof(union un2));
return 0;
}
前几章向大家介绍了大小端字节序存储,其中就提及过运用联合体实现大小端存储的判断,现在我们再来回顾一下:
#include
int check_sys()
{
union //这里只使用一次,就匿名了
{
char c;
int i;
}u;
u.i = 1;
return u.c;
}
int main()
{
int ret = check_sys();
if (ret == 1)
printf("小端\n");
else
printf("大端\n");
return 0;
}
这里十分巧妙地利用了联合体的共用内存的特性,将1赋值给int类型的i,在通过char类型的c访问一个字节,进而判断大小端。(大小端介绍http://t.csdnimg.cn/5g19W)
枚举,就是一一列举,就是定义标识符常量,将某一具有意义的标识符定义为枚举常量,比如:
#include
enum week
{
Mon = 1, //注意是 ,
Tues = 2,
Wed = 3,
Thur = 4,
fir = 5,
satur = 6,
sun = 0
};
int main()
{
printf("%d %d", Mon, Wed);;
return 0;
}
当枚举声明是没有初始化也是可以的,会默认从0开始,依次递增1:
如果在中间初始化为其他值,会怎么样呢?
#include
enum week
{
Sun,
Mon, //注意是 ,
Tues = 123,
Wed,
Thur =0,
fir,
Satur
};
int main()
{
printf("%d %d %d %d %d %d %d ", Sun, Mon, Tues, Wed, Thur, fir, Satur);
return 0;
}
可以看出下一个未初始化的值会根据上一个值再加上1变为自己的值,同时我们可以看出,枚举常量是允许重复的。
我们知道,定义常量还可以使用#define,那跟枚举由什么不同之处呢?枚举有什么优点呢?
1.增加代码的可读性和可维护性
2.#define定义常量是无类型的,enum定义的标识符是有类型的,会有类型检查,会更加严谨
3.便于调试,预处理阶段会删除#define定义的字符
4.可以一次定义多个常量
5.枚举常量遵循作用域规则的,声明再函数内部,只能在函数内部使用。
#include
enum week
{
Sun,
Mon, //注意是 ,
Tues = 123,
Wed,
Thur =0,
fir,
Satur
};
int main()
{
enum week day = Mon;//只能使用声明的值
printf("%d\n", day);
return 0;
}
好了,以上就是本期的全部内容,如果对你有帮助的话,那就点点赞吧(
下期再见,白白(^///^)