C语言---自定义类型(下)(枚举和联合类型)

联合体

联合体在语法的定义上跟结构体没有什么区别,主要的区别就是联合体的所有成员共用的是同一块内存空间,并且编译器会为联合体里边最大的一个成员分配足够的空间,所以联合体也叫共同体

下边来看一个定义联合体的例子。

由上边的代码,我们不仅知道了联合体是如何定义的,可以发现联合体的大小确实是与结构体的内存对齐是不一样的。

联合体的特点

在上边我们就提到了联合体内部的成员是共用同一块内存空间的,也就意味着联合体的每个成员在内存中的地址也是同一个,这也导致了修改联合体的其中一个成员会导致整个联合体的数据发生变化,从下边的代码中也可以看出。

接下来我们来感受一下修改联合体的其中一个成员变量会导致整个联合体发生变化的效果。

· 从上边的例子就可以看出,当我们给联合体的成员变量a赋值的时候,打印a的时候,里边的内容已经发生了变化,这就再一次说明了联合体是公用同一块内存空间的。

联合体大小的计算

从上边的所有例子里边,我们似乎发现联合体的大小好像就是最大成员变量的大小,其实事实不是这样的。联合体的大小首先至少要满足最大的成员的大小,但当最⼤成员⼤⼩不是最⼤对⻬数的整数倍的时候,就要对⻬到最⼤对⻬数的整数倍。

由于在C语言---自定义类型(上)(结构体类型)-CSDN博客,已经详细说过内存对齐的事情了,这里就不再额外举例子了,总之,大家之后在计算联合体的大小的时候,要注意上边的两点要求。

联合体判断大小端

C语言---数据在内存中的存储-CSDN博客里边讲过一次判断程序是大端小端的方式,大家感兴趣可以去看看,本篇给出用联合体的方式来判断。

由于联合体是共用同一块内存空间的,我可以给两个成员,一个char类型,一个int类型,给int类型的变量赋值1,用char类型的变量拿出这个数据,就只拿出了一个字节,如果是1,就说明是小端存储,如果是0,就说明是大端。

cpp 复制代码
#include<stdio.h>

union un
{
	char a;
	int b;
};

int check_sys()
{
	union un un1 = { 0 };
	un1.b = 1;
	/*if (un1.a == 1)
	{
		return 1;
	}
	else
	{
		return 0;
	}*/
	return un1.a;
}

int main()
{
	if (check_sys() == 1)
		printf("是小端存储");
	else
		printf("是大端存储");
	return 0;
}

枚举类型

枚举类型就是一一列举,把所有可能出现的值都一一列举出来,就比如一个星期从星期一到星期天。

enum week
{
Mon,
Tes,
Wed,
Tus,
Frd,
Sat,
Sun
};

{}里边是枚举的可能取值,也叫枚举常量 ,可以通俗的理解为,把一连串的常量都放在了一个枚举的类型里边,这样与**#define** 定义的常量虽然几乎是可以同义替换的,但是枚举类型是由类型的限制的,并且**#define**定义的常量可以在整个工程里边使用,而枚举类型是遵循作用域范围的,相当于更加的安全一点。

枚举体里边的常量也是有值的,从0开始,依次递增,当然,也可以给它们赋你想要的值。

下边给一个完整的枚举的例子。

cpp 复制代码
#include<stdio.h>
enum Sex
{
	MALE,
	FEMALE,
	SECRET
};

int main()
{
	enum Sex man = MALE;
	return 0;
}
相关推荐
十五年专注C++开发18 分钟前
Oat++: 一个轻量级、高性能、零依赖的 C++ Web 框架
开发语言·c++·web服务·oatpp
陈天伟教授19 分钟前
心电心音同步分析-案例:原型设计一
开发语言·人工智能·python·语言模型·架构
Ar-Sr-Na21 分钟前
STM32现代化AI开发指南-VSCode环境配置(macOS)
c语言·人工智能·vscode·stm32·嵌入式硬件·硬件工程
Allen_LVyingbo22 分钟前
量子计算Dirac Notation基本教学—从零基础到读懂量子信息论文(下)
开发语言·人工智能·python·数学建模·量子计算
wjs202429 分钟前
Ruby File 类和方法
开发语言
xyq202433 分钟前
API 类别 - UI 核心
开发语言
Dxy12393102161 小时前
Python路径算法简介
开发语言·python·算法
文慧的科技江湖1 小时前
光储充协同的终极闭环:用SpringCloud微服务打造“发-储-充-用“智能能源网络 - 慧知开源充电桩管理平台
java·开发语言·spring cloud·微服务·能源·充电桩开源平台·慧知重卡开源充电桩平台
東雪木1 小时前
Java学习——内部类(成员内部类、静态内部类、局部内部类、匿名内部类)的用法与底层实现
java·开发语言·学习·java面试
昵称暂无11 小时前
通过 C# 复制 Word 文档、指定段落、指定节
开发语言·c#·word