零基础自学C语言|自定义类型:联合与枚举

news2024/11/20 18:26:15

✈联合体

🚀联合体的类型声明

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

声明举例:

union Un
{
	char a;
	int b;
};

计算大小:

union Un
{
	char a;
	int b;
};

int main()
{
	printf("%d", sizeof(union Un));
	return 0;
}

结果:

为什么是4呢?

🚀联合体的特点

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


union Un
{
	char a;
	int b;
};

int main()
{
	union Un n = { 0 };
	//输出的结果是一样的吗?
	printf("%p\n", &n);
	printf("%p\n", &(n.a));
	printf("%p\n", &(n.b));
	return 0;
}

输出的结果:


//联合类型的声明
union Un
{
 char c;
 int i;
};
int main()
{
 //联合变量的定义
 union Un un = {0};
 un.i = 0x11223344;
 un.c = 0x55;
 printf("%x\n", un.i);
 return 0; }

 运行结果:

 代码1输出的三个地址一模一样,代码2的输出,我们发现将i的第4个字节的内容修改为55了。
我们仔细分析就可以画出,un的内存布局图。

🚀相同成员的结构体和联合体对比

我们再对比一下相同成员的结构体和联合体的内存布局情况。 

struct S
{
	char c;
	int i;
};

union Un
{
	char c;
	int i;
};

 🚀联合体大小的计算

  • 联合的大小至少是最大成员的大小
  • 当最大成员大小不是最大对齐数的整数倍的时候,就要对齐到最大对齐数的整数倍
#include <stdio.h>
union Un1
{
	char c[5];
	int i;
};
union Un2
{
	short c[7];
	int i;
};
int main()
{
	//下⾯输出的结果是什么?
	printf("%d\n", sizeof(union Un1));
	printf("%d\n", sizeof(union Un2));
	return 0;
}

比如,我们要搞一个活动,要上线一个礼品兑换单,礼品兑换单中有三种商品:图书、杯子、衬衫。
每一种商品都有:

库存量、价格、商品类型和商品类型相关的其他信息。
图书:书名、作者、页数
杯子:设计
衬衫:设计、可选颜色、可选尺寸

那我们不耐心思考,直接写出一下结构:

struct gift_list
{
	//公共属性
	int stock_number;//库存量
	double price; //定价
	int item_type;//商品类型

	//特殊属性
	char title[20];//书名 123456789
	char author[20];//作者
	int num_pages;//⻚数

	char design[30];//设计
	int colors;//颜⾊
	int sizes;//尺⼨
};

上述的结构其实设计的很简单,用起来也方便,但是结构的设计中包含了所有礼品的各种属性,这样使得结构体的大小就会偏大,比较浪费内存。因为对于礼品兑换单中的商品来说,只有部分属性信息是常用的。比如:
商品是图书,就不需要design、colors、sizes。
所以我们就可以把公共属性单独写出来,剩余属于各种商品本身的属性使用联合体起来,这样就可以
介绍所需的内存空间,一定程度上节省了内存。

struct gift_list
{
	int stock_number;//库存量
	double price; //定价
	int item_type;//商品类型

	union {
		struct
		{
			char title[20];//书名
			char author[20];//作者
			int num_pages;//⻚数
		}book;
		struct
		{
			char design[30];//设计
		}mug;
		struct
		{
			char design[30];//设计
			int colors;//颜⾊
			int sizes;//尺⼨
		}shirt;
	}item;
};

🚀联合体练习

写一个程序,判断机器是大端还是小端

参考代码:

int check_sys()
{
	union s
	{
		int i;
		char a;
	}un;
	un.i = 1;
	return un.a;
}

int main()
{
	if (check_sys)
	{
		printf("小端\n");
	}
	else
	{
		printf("大端\n");
	}
	return 0;
}

✈枚举类型

🚀枚举类型的声明

枚举类型的声明枚举顾名思义就是一一列举

把可能的取值一一列举。比如我们现实生活中:
一周的星期一到星期日是有限的7天,可以一一列举
性别有:男、女、保密,也可以一一列举
月份有12个月,也可以一—列举
三原色,也是可以意义列举

这些数据的表示就可以使用枚举了。

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

enum Sex//性别
{
	man,
	woman,
	secret
};

enum Color//颜色
{
	RED,
	GREEN,
	BLUE
};

以上定义的 enum Day, enum Sex,enum Color 都是枚举类型。
中的内容是枚举类型的可能取值,也叫枚举常量。

这些可能取值都是有值的,默认从0开始,依次递增1,当然在声明枚举类型的时候也可以赋初值。

enum Color//颜色
{
	RED,
	GREEN,
	BLUE
};

int main()
{
	printf("%d %d %d ", RED, GREEN, BLUE);
	return 0;
}

给枚举常量赋初值:

🚀枚举类型的优点

为什么使用枚举?
我们可以使用#define定义常量,为什么非要使用枚举?
枚举的优点:

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

🚀枚举类型的使用

使用枚举常量给枚举变量赋值:

enum Color//颜色
{
	RED=4,
	GREEN=8,
	BLUE=18
};

int main()
{
	enum Color clr = GREEN;//赋值
	return 0;
}

那是否可以拿整数给枚举变量赋值呢?在C语言中是可以的,但是在C++是不行的,C++的类型检查比较严格。

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

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

相关文章

鸿蒙开发月薪过万,背后的秘密~

自从智联招聘公布出春节后首周的岗位需求数据后&#xff0c;鸿蒙开发岗位就被推上了热潮&#xff01;鸿蒙相关职位数同比增长163%&#xff0c;投递人数同比增长349%&#xff0c;即分别增至去年同期的2.6倍、4.5倍&#xff0c;涨势突出。 于是我的朋友圈中就有人去市场中简单探…

Linux下menuconfig与Kconfig基础知识概要

一、简介 menuconfig是Linux平台用于管理代码工程、模块及功能的实用工具。上至决定某一程序模块是否编译&#xff0c;下到某一行具体的代码是否需要编译以及某个项的值在本次编译时该是什么都可由menuconfig来定义。 menuconfig的使用方式通常是在编译系统之前在系统源代码根…

php.exe运行时,提示缺少VCRUNTIME140.dll

php.exe运行时&#xff0c;提示缺少VCRUNTIME140.dll 下载地址 https://www.microsoft.com/zh-cn/download/details.aspx?id48145根据需要选择下载3.运行安装后&#xff0c;再次运行php.exe。

【XMU学科实践二】豆瓣爬虫实践

文章目录 分析豆瓣阅读网站完整爬虫代码 叠甲&#xff1a;仅供学习。。 XMU的小朋友实在不会了可以参考我的思路&#xff0c;但还是建议自己敲一遍哈。 学科实践二还是挺有意思的&#xff01; 分析豆瓣阅读网站 豆瓣阅读出版页面 打开浏览器开发者工具&#xff0c;可以看到如下…

Apache Paimon系列之:认识Paimon

Apache Paimon系列之&#xff1a;认识Paimon 一、认识Paimon二、统一存储三、基本概念1.文件布局2.Snapshot3.清单文件4.数据文件5.分区6.一致性保证 一、认识Paimon Apache Paimon的架构&#xff1a; 如上架构所示&#xff1a; 读/写&#xff1a;Paimon 支持多种读/写数据和…

CLion 配置 Qt 开发环境

文章目录 CLion 配置 Qt 开发环境环境说明基本配置1. 创建Qt项目2. 设置CLion工具链3. 配置外部工具 一些问题的补充 CLion 配置 Qt 开发环境 环境说明 操作系统&#xff1a;Windows 10 CLion版本&#xff1a;2023.3.4 CMake版本&#xff1a;3.27.7 Qt6版本&#xff1a;6.6…

后Xposed时代: 一篇文章看懂如何安装和使用Edxposed

文章转载于:https://blog.coderstory.cn/guide-install-edxposed/ 序言: 大名鼎鼎的xposed框架不必多说了吧&#xff0c;想要实现QQ抢红包&#xff0c;微信抢红包&#xff0c;防止消息撤回等功能必须得靠它的支持才行。xposed也是所有android系统获取root后必装的东西。但可惜…

跨境电子商务支付与结算

一、跨境电子商务支付与结算的业务架构 跨境电子商务支付与结算的业务架构&#xff0c;结合跨境电子商务支付与结算的技术架构&#xff0c;其业务架构主要包括以下五大模块 &#xff08;1&#xff09;商户模块。商户模块包括虚拟账户、管理平台、多币种收银台、争议管理。 &…

【Django开发】前后端分离美多商城项目第1篇:美多商城【附代码文档】

美多商城项目4.0文档完整教程&#xff08;附代码资料&#xff09;主要内容讲述&#xff1a;美多商城&#xff0c;项目准备&#xff0c;商业模式介绍&#xff0c;开发流程&#xff0c;需求分析&#xff0c;项目架构&#xff0c;创建工程&#xff0c;1. 在git平台创建工程1.B2B--…

flex弹性盒子实现左中右居中布局

1、效果展示 2、布局与样式 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>测试弹性盒子</title> </head> <body> <div class"out-parent"><div class"…

C++入门篇(2)

1. 内联函数 1.1 概念 C中&#xff0c;以 inline 修饰的函数叫做内联函数&#xff0c;编译时C编译器会在调用内联函数的地方展开&#xff0c;没有函数调用建立栈帧的开销&#xff0c;内联函数提升程序运行的效率。 #include <iostream> using namespace std;int Add(int…

Java后端八股文之java基础

文章目录 0.Java 中有 8 种基本数据类型1. 为什么浮点数运算会丢失精度&#xff1f;如何解决&#xff1f;2. 面向对象的三大特征2.1 封装2.2 继承2.3 多态 3. 深拷贝和浅拷贝的区别&#xff1f;什么是引用拷贝&#xff1f;4. equals方法与“”方法4.1 4.2 equals方法 5.hashcod…

LeetCode543题:二叉树的直径(python3)

代码思路&#xff1a; 先递归调用左儿子和右儿子求得它们为根的子树的深度 L和 R &#xff0c;则该节点为根的子树的深度即为max(L,R)1。该节点的 dnode值为LR1 递归搜索每个节点并设一个全局变量 ans记录 dnode的最大值&#xff0c;最后返回 ans-1 即为树的直径。 # Definit…

蓝桥杯历年真题省赛 java b组 2016年第七届 凑算式

一、题目 凑算式 B DEF A --- ------- 10 C GHI 这个算式中A~I代表1~9的数字&#xff0c;不同的字母代表不同的数字。 比如&#xff1a; 68/3952/714 就是一种解法&#xff0c; 53/1972/486 是另一种解法。 这个算式一共有多少种解法&#xff1f; 注意&a…

数据结构---C语言版 树 图解版力扣144/94/102

树的声明&#xff1a; #include<stdio.h> #include<stdlib.h> using namespace std;typedef char BiElemType; typedef struct BiTNode{BiElemType data;struct BiTNode* lchild;struct BiTNode* rchild; }BiTNode,*BiTree; //树中任何一个节点都是一个结构体&am…

优秀的前端框架vue,原理剖析与实战技巧总结【干货满满】

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; 所属的专栏&#xff1a;前端零基础教学&#xff0c;实战进阶 景天的主页&#xff1a;景天科技苑 文章目录 Vuevue.js库的基本使用vue.js的M-V-VM思…

CountDownLatch介绍和使用

1. CountDownLatch是什么 CountDownLatch 是 Java.util.concurrent 包中的一个同步工具类&#xff0c;用于控制线程的执行顺序。它的主要作用是让一个或多个线程等待其他线程完成操作后再继续执行。 2. CountDownLatch 类常用方法 CountDownLatch(int count) 是 CountDownLa…

网工内推 | 国企、上市公司网工、运维,CCNA即可,补贴福利多

01 深圳新思 招聘岗位&#xff1a;网络工程师&#xff08;中电集团&#xff09; 职责描述&#xff1a; 1&#xff1a;负责办公室电脑的桌面运维&#xff0c;主要是windows维护与应用维护&#xff1b; 2&#xff1a;负责办公室网络设备配置&#xff0c;如防火墙&#xff0c;交换…

应用工程中获取Shapefile文件的图形信息并显示

本文用纯前端获取shp文件以及前后端交互的方式获取Shapefile文件中的图形信息 1.案例说明 在日常的WebGIS开发中&#xff0c;我们往往会面对&#xff0c;需要用户选择矢量数据&#xff0c;通过矢量数据中的空间范围信息&#xff0c;显示在界面上&#xff0c;并给用户的下一步…

目标检测C-RNN,Fast C-RNN,Faster C-RNN,SSD,Mask R-CNN 理论简单介绍

参考&#xff1a; https://zh-v2.d2l.ai/chapter_computer-vision/multiscale-object-detection.html R-CNN 及系列 区域卷积神经网络 region-based CNN R-CNN R-CNN首先从输入图像中选取若干&#xff08;例如2000个&#xff09;提议区域&#xff0c;并标注它们的类别和边界…