类型详解(枚举+联合)

本文介绍了C/C++中的枚举(enum)和联合(union)类型。枚举用于列举固定数量的常量,增强代码可读性,具有类型检查功能。联合则是一种特殊类型,其成员共享同一块内存空间,大小至少为最大成员的大小,可用于探究系统字节序等。枚举的注意事项包括类型检查,而联合在内存利用上提供了独特优势。
摘要由CSDN通过智能技术生成

目录

枚举

枚举类型的定义

枚举的优点

注意事项 

联合(共用体) 

联合类型的定义

联合的特点

联合大小的计算

结束语


枚举

就是列举对象,比如一周里面可以一一列举出星期一到星期天

枚举类型的定义

例如以下三种枚举的定义

// 星期
enum Day
{
        Mon ,
        Tues ,
        Wed ,
        Thur ,
        Fri ,
        Sat ,
        Sun
};
// 性别
enum Sex
{
        MALE ,
        FEMALE ,
}
// 颜色
enum Color
{
        RED ,
        GREEN ,
        BLUE
};
以上定义的 enum Day enum Sex enum Color 都是枚举类型。
{ } 中的内容是枚举类型的可能取值,也叫 枚举常量
这些可能取值都是有值的,默认从 0 开始,一次递增 1 ,当然在定义的时候也可以赋初值。

当然我们也可以改它们的数值

枚举的优点

当然我们还可以使用 #define 定义常量
枚举的优点:
1. 增加代码的可读性和可维护性
2. #define 定义的标识符比较枚举有类型检查,更加严谨。
3. 防止了命名污染(封装)
4. 便于调试
5. 使用方便,一次可以定义多个常量

注意事项 

枚举是有类型的,注意这一点比较重要,一些代码在C中可以运行但是在例如在语法更严格的C++上面会出错

例如在C中,这是被允许的

#include<stdio.h>
enum Day
{
    Mon = 1,        //枚举常量
    Tues,
};

int main() {

    enum Day S = 5;        //在C中可以这样写,但是在语法更严格的C++中是不被如同的

    return 0;                       //因为枚举常量是不可以修改的
}

在C++中会直接报错,因为类型是不可以修改的

联合(共用体) 

联合类型的定义

联合也是一种特殊的自定义类型
这种类型定义的变量也包含一系列的成员,特征是这些成员公用同一块空间(所以联合也叫共用体)。
//联合体

#include<stdio.h>
//联合类型的声明
union Un
{
	char c;
	int i;
};

int main()
{
	union Un u;
	//计算变量的大小
	printf("%d\n", sizeof(u));

	printf("%p\n", &u);
	printf("%p\n", &(u.c));
	printf("%p\n", &(u.i));

	return 0;
}

我们会发现这么一个独特的现象 

 

联合的特点

联合的成员是共用同一块内存空间的,这样一个联合变量的大小,至少是最大成员的大小(因为联合至少得有能力保存最大的那个成员)

利用联合体的特点可以,求出当前计算机的大小端的情况

//得出当前机器的大小端问题
#include<stdio.h>

int Check_sys()
{
	//法一:利用类型的特性来得出大小端
	//int i = 1;
	//return *(char*)&i;

	//法二:利用联合体的特点得出大小端
	union Un
	{
		int i;
		char c;
	}u;
	u.i = 1;
	return u.i;
}

int main() {

	int ret = Check_sys();
	if (ret = 1)
	{
		printf("小端\n");
	}
	else
	{
		printf("大端\n");
	}

	return 0;
}

联合大小的计算

观察下面的几行代码可以知道联合体其实和结构体一样都存在对齐

联合的大小至少是最大成员的大小。

当最大成员大小不是最大对齐数的整数倍的时候,就要对齐到最大对齐数的整数倍。

结束语

随着时间的推移,代码量的提升,眼中也渐渐可以看懂更多的代码了,真是一个美妙的境界,就像打怪升级一般,歪歪

  • 6
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

清风玉骨

爱了!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值