C语言自定义类型_枚举联合(3)

news2025/1/20 3:45:32

目录

枚举

什么是枚举类型?

枚举的声明

枚举的定义

枚举的优点

枚举的使用

联合(共用体)

什么是联合呢?

联合类型的定义

联合的特点

联合使用

联合大小的计算

联合的应用


今天接着我们来结束自定义类型。🆗🆗

枚举

在初始C语言中学习常量有:字母常量 #define定义的标识符常量 cosnt修饰的常变量 枚举常量

什么是枚举类型?

枚举顾名思义就是【一一列举】。把可能的取值一一列举。比如我们现实生活中:一周的星期一到星期日是有限的7天,可以一一列举。人的性别有;男,女,保密,也可以一一列举。月份有12个月,也可以一一列举。所以就有了枚举类型。

enum tag
{
	possible value member
    member1,
    member2,
    member3
};
  • enum 枚举关键字 不能省略
  • tag 标签 自定义
  • member 枚举的可能取值_枚举常量  后面是逗号最后没有逗号
  • 分号不要忘记 

枚举的声明

//枚举类型的声明
enum Sex
{
	MALE,
	FEMALE,
	SECRET
};
enum Color
{
	RED,
	GREEN,
	BLUE
};
  • 简单理解,定义一种枚举类型,这种类型有有限的取值
  • 枚举类型所定义的枚举的常量是不能被修改的
  • 枚举常量默认值是从0开始,依次+1的值
  • 枚举常量的默认值是可以在  声明枚举常量 的时候初始化为别的值
#include<stdio.h>
enum Sex
{
	MALE=4,//ok
	FEMALE=5,//ok
	SECRET=6
};
enum Sex
{
	MALE=4,//ok
	FEMALE,//ok 5
	SECRET//6
};
int main()
{
	MALE=5//err❌
	return 0;
}

枚举的定义

这样定义变量看似可以,但是不建议这样写。 

//枚举类型的声明
#include<stdio.h>
enum Sex
{
	MALE,
	FEMALE,
	SECRET
};
int main()
{
	enum Sex sex = MALE;//OK
	enum Sex sex = 2;//err❌
	//枚举类型    //整型
	printf("%d\n", sizeof(sex));//4
	return 0;
}

枚举的优点

我们抛出一个问题为什么要用枚举?我们可以使用 #define 定义常量,为什么非要使用枚举?

enum Sex
{
	MALE,
	FEMALE,
	SECRET
};
//类型

#define MALE 3
#define FEMALE 4
#define SECRET 5
//替换
  • 增加代码的可读性和可维护性
  • 和#define定义的标识符比较枚举有类型检查,更加严谨。
  • 防止了命名污染(封装)
  • 便于调试
  • 使用方便,一次可以定义多个常量

以上都是非常重要的原因,在平时写代码我们很少用到枚举,但是留时间写代码,总会有所感悟的

枚举的使用

enum Color//颜色
{
RED=1,
GREEN=2,
BLUE=4
};
enum Color clr = GREEN;//只能拿枚举常量给枚举变量赋值,才不会出现类型的差异。

联合(共用体)

什么是联合呢?

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

union tag
{
	member - list;
};
  •  union 联合关键字
  •  tag标签 自定义
  •  member-list 成员列表
  • 分号; 不要忘记

联合类型的定义

union Un
{
	char c;
	int i;
};

联合的特点

 下面代码那我们猜测一下大小是5个字节吗? 

#include<stdio.h>
union Un
{
	char c;
	int i;
};
int main()
{
	union Un un;
	printf("%d\n", sizeof(un));//?
	return 0;
}

 既然都这么问了,那肯定不是5个字节的大小。提醒:联合体的成员是公用一块空间。 

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

#include<stdio.h>
union Un
{
	char c;
	int i;
};
int main()
{
	union Un un;
	printf("%d\n", sizeof(un));
	printf("%p\n", &un.c);
	printf("%p\n", &un.i);
	return 0;
}

 

特点:公用同一块空间。所以改变c的同时会改变i,同一时间只能访问使用一个数据。 

联合使用

 面试题:判断当前计算机的大小端存储

忘记了大小端的戳一戳:C语言之整数_数据存储篇(1)-CSDN博客 

#include<stdio.h>
int check(int i)
{
	int* p = &i;
	return  *(char*)p;
}
int main()
{
	int i = 1;
	int ret=check(i);
	if (ret == 1)
	{
		printf("小端存储");
	}
	else
	{
		printf("大端存储\n");
	}
	return 0;
}

用我们的联合也可以轻松搞定!! 

#include<stdio.h>
int check(int i)
{
	union Un//可以用匿名联合
	{
		char c;
		int i;
	};
	union Un un;
	un.i = 1;
	return un.c;
}
int main()
{
	int i = 0;
	int ret=check(i);
	if (ret == 1)
	{
		printf("小端存储");
	}
	else
	{
		printf("大端存储\n");
	}
	return 0;
}

联合大小的计算

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

联合体的大小是最大成员的大小对吗?当然是错误的。

#include<stdio.h>
union Un
{
	char c[5];
	int i;
};
int main()
{
	union Un un;
	printf("%d\n", sizeof(un));
	return 0;
}

这个和我们上篇博文讲的对齐有关,大家自己算一算。 

union Un1
{
char c[5];
int i;
};
union Un2
{
short c[7];
int i;
};
//下面输出的结果是什么?
printf("%d\n", sizeof(union Un1));//8
printf("%d\n", sizeof(union Un2));//16

联合的应用

【后面博客我们会讲通讯录的程序🆗】

✔✔✔✔✔最后,感谢大家的阅读,若有错误和不足,欢迎指正!

下篇博文我们学习动态内存管理。🆗🆗

代码------→【gitee:唐棣棣 (TSQXG) - Gitee.com】

联系------→【邮箱:2784139418@qq.com】

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

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

相关文章

人工智能(AI)基础知识学习库

人工智能&#xff08;AI&#xff09;基础知识学习库 1. AI 算法2. 基础科普3. 数学基础4. 深度学习5. 特征工程6. 机器学习7. 语音交互8. 自然语言处理9. 计算机视觉 声明&#xff1a;此文仅作为个人学习记录 人工智能&#xff08;AI&#xff09;基础知识学习库链接&#xff1a…

《Spring Boot入门》

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

麻雀搜索算法(SSA)(含MATLAB代码)

先做一个声明&#xff1a;文章是由我的个人公众号中的推送直接复制粘贴而来&#xff0c;因此对智能优化算法感兴趣的朋友&#xff0c;可关注我的个人公众号&#xff1a;启发式算法讨论。我会不定期在公众号里分享不同的智能优化算法&#xff0c;经典的&#xff0c;或者是近几年…

Citespace、vosviewer、R语言文献计量学 、SCI

​文献计量学是指用数学和统计学的方法&#xff0c;定量地分析一切知识载体的交叉科学。它是集数学、统计学、文献学为一体&#xff0c;注重量化的综合性知识体系。特别是&#xff0c;信息可视化技术手段和方法的运用&#xff0c;可直观的展示主题的研究发展历程、研究现状、研…

【AI视野·今日Sound 声学论文速览 第十九期】Thu, 5 Oct 2023

AI视野今日CS.Sound 声学论文速览 Thu, 5 Oct 2023 Totally 13 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Sound Papers Multi-resolution HuBERT: Multi-resolution Speech Self-Supervised Learning with Masked Unit Prediction Authors Jiatong Shi, Hirof…

虫情测报系统——农业害虫的监测解决方案

KH-CQPest虫情测报系统&#xff0c;是以物联网技术、传感器技术、光控技术为基础&#xff0c;针对昆虫害监测和报告的解决方&#xff0c;它能够为农田或果园的昆虫害防护工作提供实时、准确的情报。 虫情测报系统能够通过虫情测报仪的诱虫功能吸引害虫并进行捕获&#xff0c;利…

redis学习(二)——redis常见命令及基础数据类型

数据类型 基础数据类型 字符串 String abcMap集合 Hsah {name:“zhangsan”,age:18}列表 List [a, b, c, d]Set集合 Set {a,b,c}有序Set集合 SortSet {a:1,b:2,c:3} 特殊数据类型 GEO 地理坐标 {A:(100.2,35.1)}BitMap 位图&#xff0c;只存储0和1 01101011101HyperLog 基数…

遵循这些守则,PCB布局就不会差

PCB设计中&#xff0c;首先要做的就是对于PCB布局&#xff0c;它是将整个板子中的元器件进行排布&#xff0c;位置分布&#xff0c;一个好的布局&#xff0c;可以让板子结构清晰&#xff0c;并且在布线的时候也会更加方便与明朗&#xff0c;达到事半功倍的效果。 对于PCB布局&a…

【短文】Linux怎么读取文件大小

2023年10月6日&#xff0c;周五晚上 使用如下命令即可&#xff1a; du -h filenamedu命令在Linux/Unix系统中的英文全称是"disk usage"。即磁盘使用量的意思。 du命令用来显示文件和目录占用磁盘空间的大小。 du命令的巧用&#xff1a; ls | du -h 通过这条命令…

ChatGLM2-6B的通透解析:从FlashAttention、Multi-Query Attention到GLM2的微调、源码解读

前言 本文最初和第一代ChatGLM-6B的内容汇总在一块&#xff0c;但为了阐述清楚FlashAttention、Multi-Query Attention等相关的原理&#xff0c;以及GLM2的微调、源码解读等内容&#xff0c;导致之前那篇文章越写越长&#xff0c;故特把ChatGLM2相关的内容独立抽取出来成本文 …

测试时间不够,你会如何处理?

工作中经常会遇到测试时间不够充分的情况&#xff0c;当测试时间不足的情况下&#xff0c;如何做到不延误测试进度&#xff0c;又能保证测试质量&#xff1f; 1、根据测试目标和需求&#xff0c;确定测试的优先级&#xff0c;首先测试最重要和核心的功能和场景。 确保关键功能…

测试员最爱犯的十个思想问题

1、测试应该找到所有bug&#xff0c;只要线上出现bug就是罪大恶极 测试新人最容易出现此类思想&#xff0c;认为测试就应该发现所有bug&#xff0c;生产环境出现bug就是测试的锅。这种想法不能说完全错误&#xff0c;相反&#xff0c;包括很多不懂行的领导认为这相当正确。但我…

SpringMVC系列-4 参数解析器

背景&#xff1a; 本文作为SpringMVC系列的第四篇&#xff0c;介绍参数解析器。本文讨论的参数解析表示从HTTP消息中解析出JAVA对象或流对象并传参给Controller接口的过程。 本文内容包括介绍参数解析器工作原理、常见的参数解析器、自定义参数解析器等三部分。其中&#xff0…

css实现不规则图片文字环绕效果

依旧,先上效果图,可以看见,文字环绕这个椭圆形的图片, 依旧是遵循开源精神,代码就直接放下面了 (点个赞或者给个评论啥的吧,我就发现我的文章全是光看不点赞,不评论的的) <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8&quo…

【重拾C语言】六、批量数据组织(二)线性表——分类与检索(主元排序、冒泡排序、插入排序、顺序检索、对半检索)

目录 前言 六、批量数据组织——数组 6.4 线性表——分类与检索 6.4.1 主元排序 6.4.2 冒泡排序 6.4.3 插入排序 6.4.4 顺序检索&#xff08;线性搜索&#xff09; 6.4.5 对半检索&#xff08;二分查找&#xff09; 算法比较 前言 线性表是一种常见的数据结构&#xf…

Linux网络编程系列之TCP协议编程

一、什么是TCP协议 TCP&#xff08;Transmission Control Protocol&#xff09;协议是一种面向连接的、可靠的、基于字节流的传输控制协议&#xff0c;属于传输层。TCP协议可以通过错误检测、重传丢失的数据包、流量控制、拥塞控制等方式来实现可靠传输&#xff0c;同时也具有较…

string和const char*参数类型选择的合理性对比

在编程中&#xff0c;我们经常需要处理字符串类型的参数。在C中&#xff0c;有两种常见的表示字符串的参数类型&#xff0c;即string和const char*。本文将对比这两种参数类型的特点&#xff0c;分析其在不同情况下的合理性&#xff0c;以便程序员能够根据实际需求做出正确的选…

超赞极简奶油风装修攻略~速来抄作业

如果您想将极简奶油风应用于自家装修&#xff0c;以下是小编的一些优化建议&#x1f3e0;✨&#xff1a;色彩选择&#x1f3a8;&#xff1a;主色调应选择简洁、柔和的颜色&#xff0c;如白色☁、米色☕、淡灰色&#x1f32b;等。在这些基础颜色中适度添加1-2个饱和度较高的活力…

接收机灵敏度和动态范围定义

一、接收机灵敏度 灵敏度是来自天线的最小信号电平的特定值&#xff0c;在该特定值处接收器可以提供足够的输出信噪比&#xff08;SNR&#xff09;。最小可辨别信号&#xff08;MDS&#xff09;是0dB射频信噪比&#xff08;RFSNR&#xff09;的信号电平。MDS通常以dBm表示。 图…

【kubernetes】kubernetes中的应用配置(ConfigMap和Secret)

目录 1 为什么需要ConfigMap和Secret2 k8s中给容器传递配置的方式3 ConfigMap的基本使用4 ConfigMap的实践5 Secret的基本使用6 ConfigMap和Secret的对比 1 为什么需要ConfigMap和Secret 应用程序启动过程中通常需要传递参数&#xff0c;当参数较多时会将参数保存到配置文件中…