C语言之联合和枚举

news2024/11/26 0:46:37

C语言之联合和枚举

文章目录

  • C语言之联合和枚举
    • 1. 联合体
      • 1.1 联合体的声明
      • 1.2 联合体的特点
      • 1.3 结构体和联合体对比
      • 1.4 联合体大小的计算
      • 1.5 联合体小练习
    • 2. 枚举
      • 2.1 枚举类型的声明
      • 2.2 枚举类型的优点
      • 2.3 枚举类型的使用

1. 联合体

1.1 联合体的声明

像结构体⼀样,联合体也是由⼀个或者多个成员构成,这些成员可以不同的类型。
但是编译器只为最⼤的成员分配⾜够的内存空间。联合体的特点是所有成员共⽤同⼀块内存空间。所以联合体也叫:共⽤体
给联合体其中⼀个成员赋值,其他成员的值也跟着变化

1.2 联合体的特点

代码一:

#include <stdio.h>

union U
{
	char a;
	int b;
};
int main()
{
	union U uu = { 0 };
	printf("%zd\n", sizeof(uu));
	return 0;
}

代码运行结果:>
4

结论:联合的成员是公用一块空间的,联合体变量的大小至少是最大成员的大小(至少确保能存下最大的那个成员)

代码二:

#include <stdio.h>

union U
{
	char a;
	int b;
};
int main()
{
	union U uu = { 0 };
	printf("%p\n", &(uu.a));
	printf("%p\n", &(uu.b));
	printf("%p\n", &uu);
	return 0;
}

代码运行结果:>
012FFD90
012FFD90
012FFD90

可以看到无论是联合体的地址还是联合体成员的地址都是一样的,说明他们共用同一块空间

代码三:

#include <stdio.h>

union U
{
	char a;
	int b;
};
int main()
{
	union U uu = { 0 };
	uu.b = 0x11223344;
	uu.a = 0x55;
	printf("%#x\n", uu.b);
	return 0;
}

%#x打印的是带0x的十六进制数,0x11223344是一个十六进制数

代码运行结果:>
0x11223355

在这里插入图片描述
由于是小端字节序存储,优先存低字节的也就是44,然后通过char修改了第一个字节的内容,将44修改成了55,所以打印结果为0x11223355

1.3 结构体和联合体对比

union U
{
	char a;
	int b;
};
struct S
{
	char a;
	int b;
};

在这里插入图片描述
相对于结构体,联合体较节省空间

1.4 联合体大小的计算

  1. • 联合体大小至少是联合体中最大成员的大小
  2. • 当最大成员的大小不是最大对齐数的整数倍时,就要对齐到最大对齐数的整数倍,和结构体一样,联合体也是有对齐的
#include <stdio.h>

union U1
{
	char a[7];
	int b;
};
union U2
{
	short a[7];
	int b;
};
int main()
{
	union U1 u = { 0 };
	union U2 uu = { 0 };
	printf("%zd\n", sizeof(u));
	printf("%zd\n", sizeof(uu));
	return 0;
}

代码运行结果如下:>
8
16

联合体U1中有两个成员,char a[7] int b 其中最大成员为char a[7],为7个字节,char为1字节,默认对齐数为8,取较小值1,int为4字节,默认对齐数为8,取较小值4,所以两个成员中的最大对齐数为4,最大成员的大小为7,不是最大对齐数4的倍数,所以将对齐至8字节,对齐之后才是联合体的大小

同理联合体U2,也有两个成员,最大成员的大小为14字节,不是最大对齐数4的倍数,所以将对齐至16字节,对齐之后才是联合体的大小

1.5 联合体小练习

要求:写一个代码,判断当前机器的字节序

代码一:

#include <stdio.h>

int check_sys()
{
	int n = 1;
	return *(char*)&n;
}
int main()
{
	int ret = check_sys();
	if (ret == 1)
		printf("小端\n");
	else
		printf("大端\n");
	return 0;
}

小端字节序,将低字节内容存到低地址,高字节内容存到高地址
大端字节序,将高字节内容存到低地址,低字节内容存到高地址
内存使用优先使用低地址

1的十六进制为00 00 00 01
小端字节序为 01 00 00 00
大端字节序为 00 00 00 01

取出1的地址,将其从int*类型的指针强制类型转化为char*类型的地址,这样解引用的时候就会访问低地址处的内容,如果解引用得到1则是小端,得到0则为大端

代码二:
使用联合体的方式

#include <stdio.h>

int check_sys()
{
	union
	{
		char a;
		int b;
	}un;
	un.b = 1;
	return un.a;
}
int main()
{
	int ret = check_sys();
	if (ret == 1)
		printf("小端\n");
	else
		printf("大端\n");
	return 0;
}

通过联合体公用同一块空间的方式,如果第一个字节中存的是1则是小端,如果存的是0则是大端

2. 枚举

2.1 枚举类型的声明

枚举顾名思义就是一一列举

enum Day//星期
{
	Mon,
	Tues,
	Wed,
	Thur,
	Fri,
	Sat,
	Sun
};

枚举类型:enum Day
枚举常量:Mon,Thus,… //枚举常量使用逗号隔开,最后一个常量不需要

枚举常量是有值的,第一个常量的值默认从0开始,依次递增1,也可以在声明的时候为枚举常量赋值

enum Color
{
	RED = 4,
	YELLOW = 8,
	BLUE = 12
};

2.2 枚举类型的优点

#define关键字为什么还要使用枚举呢

  1. 增加代码的可读性和可维护性
  2. 和#define定义的标识符⽐较枚举有类型检查,更加严谨。
  3. 便于调试,预处理阶段会删除 #define 定义的符号
  4. 使⽤⽅便,⼀次可以定义多个常量
  5. 枚举常量是遵循作⽤域规则的,枚举声明在函数内,只能在函数内使⽤

2.3 枚举类型的使用

#include <stdio.h>

enum Color
{
	RED = 4,
	YELLOW = 8,
	BLUE = 12
};

int main()
{
	enum Color clr = BLUE;//使用枚举常量为变量赋值
	return 0;
}
#include <stdio.h>

enum Color
{
	RED = 4,
	YELLOW = 8,
	BLUE = 12
};

int main()
{
	enum Color clr = 12;//使用整数为变量赋值,12 == BLUE
	return 0;
}

在C语言中,对其规定不是很严格,在C++中,C++的类型检查比较严格,这是个语法错误,无法使用整型对枚举变量赋值

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1287494.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C/C++,组合算法——K人活动选择问题(Activity-Selection-Problem)的源程序

1 活动选择问题 Activity-Selection-Problem with k persons 给定两个大小为 N 的数组S[]和E[]表示商店的开始和结束时间&#xff0c;以及一个整数值 K 表示人数&#xff0c; 任务是找出如果他们基于以下条件最佳地访问每个商店&#xff0c;他们总共可以访问的商店的最大数量…

UEC++ 探索虚幻5笔记(捡金币案例) day12

吃金币案例 创建金币逻辑 之前的MyActor_One.cpp&#xff0c;直接添加几个资源拿着就用 //静态网格UPROPERTY(VisibleAnywhere, BlueprintReadOnly)class UStaticMeshComponent* StaticMesh;//球形碰撞体UPROPERTY(VisibleAnywhere, BlueprintReadWrite)class USphereCompone…

《Pandas1.x实例精解 》书籍分享

Pandas介绍 Pandas&#xff1a;Python数据分析的瑞士军刀 在数据科学、机器学习和人工智能日益繁荣的今天&#xff0c;有效、准确地处理和分析数据已经成为了成功的关键。Python&#xff0c;作为一种强大且易于学习的编程语言&#xff0c;已经在这一领域占据了重要的地位。而…

面试多线程八股文十问十答第三期

面试多线程八股文十问十答第三期 作者&#xff1a;程序员小白条&#xff0c;个人博客 相信看了本文后&#xff0c;对你的面试是有一定帮助的&#xff01; ⭐点赞⭐收藏⭐不迷路&#xff01;⭐ 1.介绍一下自旋锁 重量级锁竞争时&#xff0c;尝试获取锁的线程不会立即阻塞&…

Web自动化测试怎么做?Web网页测试全流程解析

1、功能测试 web网页测试中的功能测试&#xff0c;主要测试网页中的所有链接、数据库连接、用于在网页中提交或获取用户信息的表单、Cookie 测试等。 &#xff08;1&#xff09;查看所有链接&#xff1a; 测试从所有页面到被测特定域的传出链接。 测试所有内部链接。 测…

前后端分离vue+Nodejs社区志愿者招募管理系统

1、首页 1)滑动的社区照片册 使用轮播图&#xff0c;对社区的活动纪念与实时事件宣传。 每个图片附有文字链接&#xff0c;点击跳转对应社区要闻具体页。 2)社区公告栏 日常的社区公告以及系统说明在此区域中进行说明与展示。 2、志愿活动 1)志愿活动发布 想发布需要登录 2)志愿…

12.5_黑马数据结构与算法Java

目录 001 二分查找 算法描述 002 二分查找 算法实现 003 二分查找 问题1 循环条件 004 二分查找 问题2 中间索引 thinking&#xff1a;反码补码原码&#xff1f; thinking&#xff1a;二进制转十进制&#xff1f; thinking&#xff1a;无符号右移&#xff1f; 005 二分…

图像语义分割算法(FCN/U-net)

Some definitions &#xfeff; 与目标检测不同&#xff0c;语义分割任务不但要对图片中的物体的位置和类别进行预测&#xff0c;还要精确地描绘出不同类物体之间的边界&#xff08;注意是不同类物体&#xff0c;而不是不同物体。若对同一类的不同物体也进行区分&#xff0c;则…

【CentOS】配置 Apache 服务

yum install httpd -y# 查看是否安装成功 httpd -v # 出现版本号表示成功# 启动服务 systemctl start httpd# 查看状态 systemctl status httpd # running 即可成功 ● httpd.service - The Apache HTTP ServerLoaded: loaded (/usr/lib/systemd/system/httpd.service; disable…

Unity环境配置并解决visual studio 不能智能代码提示Unity代码问题(一)

1、请先安装好unity和Visual Studio 2019 2、Visual Studio需要安装如图&#xff08;2019才会有那个移动的可以勾选&#xff09; 3、Unity配置 file->build setting windows->package manager 安装如下图 edit->preferences 3、创建c#脚本 如果还是没能智能提…

JDBC简介及快速入门-黑马(P1)

黑马视频b站链接&#xff1a; 01-JDBC简介&快速入门_哔哩哔哩_bilibili &#x1f436;一、JDBC 简介 JDBC 概念&#xff1a; JDBC 就是使用 Java 语言操作关系型数据库的一套 API。 全称&#xff08;Java DataBase Connectivity&#xff09; Java 数据库连接 JDBC 本质…

佳易王会员管理软件店铺积分以及积分兑换系统

一、佳易王会员管理软件大众版 部分功能简介&#xff1a; 1、会员信息登记 &#xff1a;可以直接使用手机号登记&#xff0c;也可以使用实体卡片&#xff0c;推荐用手机号即可。 2、会员卡类型 &#xff1a;可以自由设置卡的类型&#xff0c;比如&#xff1a;充值卡、计次卡、…

使用Docker在Debian上构建GRBL模拟器镜像:简明步骤和操作指南

概述编译编写 Dockerfile构建镜像运行测试其他 概述 本文将详细介绍如何在Debian系统上通过Docker构建GRBL模拟器镜像&#xff0c;以便进行数控机床的仿真测试。GRBL是一种开源的控制系统&#xff0c;用于控制三轴CNC机床、激光雕刻、激光切割&#xff0c;而在Docker容器中运…

力扣第374场周赛题解

这一场周赛的题目是比较难的一次&#xff0c;写了1个多小时就写了两个题目。 首先第一题&#xff1a; 纯水题&#xff0c;遍历然后进行一下判断就可以解决了。这边就不放代码了。 第二题&#xff1a; 这个题目&#xff0c;我觉得难度非常大&#xff0c;其实代码量也不大都是很…

二维码智慧门牌管理系统升级:强化信息安全的防伪技术

文章目录 前言一、解决方案概览二、具体措施 前言 随着二维码智慧门牌管理系统在城市管理、企业形象展示和商铺门店等领域的广泛应用&#xff0c;信息安全问题愈发凸显。如何保障二维码门牌信息的安全性成为当前迫切需要解决的难题。 一、解决方案概览 专码专用&#xff1a;每…

每日3道PWN(第二天)

ciscn_2019_n_1 参考&#xff1a; [BUUCTF-pwn]——ciscn_2019_n_1-CSDN博客 [BUUCTF]PWN5——ciscn_2019_n_1_ciscn_2019_n_4-CSDN博客 BUUCTF—ciscn_2019_n_1 1-CSDN博客 checksec一下 64位栈溢出 按f5查看main函数&#xff0c;双击可疑函数 发现含有命令执行的且发现fl…

不愧是字节出来的,真的太厉害了。。。

前段时间公司缺人&#xff0c;也面了许多测试&#xff0c;一开始瞄准的就是中级水准&#xff0c;当然也没指望能来大牛&#xff0c;提供的薪资在15-20k这个范围&#xff0c;来面试的人有很多&#xff0c;但是平均水平真的让人很失望。看了简历很多上面都是写有4年工作经验&…

反三角函数基本性质和函数图形

文章目录 反三角函数反三角函数图形利用反函数的性质绘制反三角图形反三角函数的定义域&值域反三角函数的恒等式推导 反三角函数 反三角函数 (wikipedia.org) 反三角函数图形 sin ⁡ ( x ) , arcsin ⁡ ( x ) \sin(x),\arcsin(x) sin(x),arcsin(x) cos ⁡ ( x ) , arccos …

2022年11月10日 Go生态洞察:十三年的Go之旅

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

11、信息打点——红队工具篇FofaQuakeSuize水泽Arl灯塔

网络空间测绘引擎 Fofa Quake shodan Zoomeye 主要搜关联资产、特征资产、资产信息&#xff08;在测绘引擎上直接搜IP&#xff0c;它会显示所有与该域名有关的信息。&#xff09; fofa和Quake测绘引擎集成化工具&#xff1a;Finger 自动化信息收集项目 ARL灯塔 Suize水泽 …