C语言自定义类型

news2025/1/18 3:47:37

本篇文章主要介绍三种自定义类型,分别是:结构体、联合体、枚举。

一.结构体

1.结构体类型的声明

直接举一个例子:

//一本书
struct s
{
	char name[10];	//名称
	char a;			//作者
	int p;			//价格
};

2.特殊的声明

结构体也可以不写结构体标签,写一个匿名结构体。这种结构体如果不重命名的话,基本就能使用一次。

//还是这个书本的例子
typedef struct 
{
	char name[10];	//名称
	char a;			//作者
	int p;			//价格
}book;

这里对他进行了重命名。

3.结构体的自引用

这个学过链表都不陌生。就是在结构体内在引用一下自身的结构体。看一下例子:

//一个节点
struct Node
{
	int n;
	struct Node* next;
};

4.结构体内存对齐(重点)

结构体内存对齐主要解决的是结构体大小的问题。

4.1对齐规则

首先我们要了解结构体的内存的对齐规则:

1. 结构体的第⼀个成员对齐到和结构体变量起始位置偏移量为0的地址处;

2. 其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处。 对齐数 = 编译器默认的⼀个对齐数 与 该成员变量大小的较小值;

PS.VS的默认数是8,Linux没有默认数。

3. 结构体总大小为最大对齐数(结构体中每个成员变量都有⼀个对齐数,所有对齐数中最大的)的 整数倍;

 4. 如果嵌套了结构体的情况,嵌套的结构体成员对齐到自己的成员中最大对齐数的整数倍处,结构体的整体大小就是所有最大对齐数(含嵌套结构体中成员的对齐数)的整数倍。

举个例子:

struct s
{
	char a;
	int b;
	char c;
};

首先a占据一个位置(规则1);b是int类型,占四个字节,根据规则2,对齐到整数倍的位置,也就是如图所示的蓝色位置;c按照同样的道理放到黄色的位置;最后整个结构体的大小根据规则3来判断,是4的倍数,所以黄色后面有三个位置是空的。

对第4条规则的解释:

struct s
{
	char a;
	int b;
	char c;
};

struct ss
{
	struct s s1; 
	int a;
};

ss中嵌套了一个s,s的对齐数是s中对齐数的最大值也就是4,s在ss中所占空间大小是它本身的大小也就是12。

4.2为什么要进行内存对齐?

从参考资料大致可以得到以下两点:

1. 平台原因 (移植原因): 不是所有的硬件平台都能访问任意地址上的任意数据的;某些硬件平台只能在某些地址处取某些特定类型的数据,否则抛出硬件异常。

2. 性能原因: 数据结构(尤其是栈)应该尽可能地在自然边界上对齐。原因在于,为了访问未对齐的内存,处理器需要作两次内存访问;而对齐的内存访问仅需要⼀次访问。假设⼀个处理器总是从内存中取8个字节,则地址必须是8的倍数。如果我们能保证将所有的double类型的数据的地址都对齐成8的倍数,那么就可以用一个内存操作来读或者写值了。否则,我们可能需要执行两次内存访问,因为对象可能被分放在两个8字节内存块中。

总的来说,结构体内存对齐就是拿空间换时间的做法。以后我们如果在某些特定条件下可以使用这个规则来定义结构体。

4.3修改默认对齐数

#pragma 这个预处理指令,可以改变编译器的默认对齐数。

#pragma pack(1)//将默认对齐数修改成1
#pragma pack()//还原回默认对齐数

5.结构体实现位段

这里简单的介绍一下位段:1. 位段的成员必须是 int、unsigned int 或signed int ,在C99中位段成员的类型也可以选择其他类型。 2. 位段的成员名后边有一个冒号和一个数字。

位段的几个成员共有同⼀个字节,这样有些成员的起始位置并不是某个字节的起始位置,那么这些位置处是没有地址的。内存中每个字节分配⼀个地址,⼀个字节内部的bit位是没有地址的。 所以不能对位段的成员使用&操作符,这样就不能使用scanf直接给位段的成员输入值,只能是先输入 放在一个变量中,然后赋值给位段的成员。

二.联合体

1.联合体的简介

联合体,又名共用体,即所有成员公用一块内存空间。如果冒然给联合体的一个成员赋值会改变其他成员的值。

//对联合体的声明
union Un
{
	char c;
	int i;
};

2.联合体大小计算

1.联合的大小至少是最大成员的大小;

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

三.枚举

1.枚举类型的声明

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

2.枚举的优点

1. 增加代码的可读性和可维护性;

2. 和#define定义的标识符比较枚举有类型检查,更加严谨;

3. 便于调试,预处理阶段会删除 #define 定义的符号;

4. 使用方便,⼀次可以定义多个常量;

5. 枚举常量是遵循作用域规则的,枚举声明在函数内,只能在函数内使用。

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

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

相关文章

NVIDIA Jetson Xavier NX入门-镜像为jetpack5(3)——pytorch和torchvision安装

NVIDIA Jetson Xavier NX入门-镜像为jetpack5(3)——pytorch和torchvision安装 镜像为jetpack5系列: NVIDIA Jetson Xavier NX入门-镜像为jetpack5(1)——镜像烧写 NVIDIA Jetson Xavier NX入门-镜像为jetpack5&#…

医院陪诊管理系统(源码+文档)

TOC) 文件包含内容 1、搭建视频 2、流程图 3、开题报告 4、数据库 5、参考文献 6、服务器接口文件 7、接口文档 8、任务书 9、功能图 10、环境搭建软件 11、十六周指导记录 12、答辩ppt模板 13、技术详解 14、前端后台管理(管理端程序) 15、项目截图 1…

CCIE-07-OSPF_TS

目录 实验条件网络拓朴逻辑拓扑实现目标 环境配置开始Troubleshooting问题1. R22的e0/0接口配置了网络类型问题2. R22和R21之间的IP地址子网掩码长度不一致问题3. R21的e0/0口配置了被动接口问题4. R3配置了不一致的hello-time问题5. R21配置了max-metric导致路由无效问题6. R3…

LLM大模型可视化-以nano-gpt为例

内容整理自:LLM 可视化 --- LLM Visualization (bbycroft.net)https://bbycroft.net/llm Introduction 介绍 Welcome to the walkthrough of the GPT large language model! Here well explore the model nano-gpt, with a mere 85,000 parameters. 欢迎来到 GPT 大…

GPUPixel:以光速打造美丽,开源跨平台的实时美颜滤镜库,赋能您的应用尽显商业级影像魅力!- 精选真开源,释放新价值。

GPUPixel:以光速打造美丽,开源跨平台的实时美颜滤镜库,赋能您的应用尽显商业级影像魅力!- 精选真开源,释放新价值。 概览 GPUPixel是一款精心设计并采用现代C11标准编写的高性能图像和视频AI美颜效果处理库,其核心价值…

vue 视频添加水印

1.需求背景 其实腾讯云点播的api也支持视频水印,但是只有单个水印,大概效果是这样子的,不满足我们的需求,我们的需求是需要视频中都是水印。 腾讯云点播水印 项目需求的水印(主要是防录屏,最后的实现效果是这样&…

【前端面试3+1】06继承方式及优缺点、缓存策略、url输入到渲染全过程、【二叉树中序遍历】

一、继承有哪些方式?以及优缺点 继承的方式包括原型链继承、构造函数继承、组合继承、原型式继承、寄生式继承和组合式继承。 1.原型链继承: 实现方式:将子类的原型指向父类的实例来实现继承。优点:简单易懂,代码量少。…

整数删除,蓝桥杯训练题

题目描述: 给定一个长度为 N 的整数数列:A1,A2,…,AN。 你要重复以下操作 K 次: 每次选择数列中最小的整数(如果最小值不止一个,选择最靠前的),将其删除,并把与它相邻的整数加上被删除的数值。 …

精读 Generating Mammography Reports from Multi-view Mammograms with BERT

精读(非常推荐) Generating Mammography Reports from Multi-view Mammograms with BERT(上) 这里的作者有个叫 Ilya 的吓坏我了 1. Abstract Writing mammography reports can be errorprone and time-consuming for radiolog…

使用STM32 MCU模拟实现PPS+TOD授时信号

简介 PPSTOD是授时信号的一种,用来传递准确的时间信息。 PPS,Pulse Per Second,是每秒一次的脉冲信号,其上升沿表示整秒的时刻。TOD,Time of Day,是时间信息。是跟随在每个PPS信号后的由串口发出的一句报…

学浪如何录屏学浪解除录屏限制

买过学浪课程的都知道,学浪PC客户端会限制你录屏,可是我们在学习的过程中需要对某个画面进行截图保存,于是为了解决这个问题,我开发了小浪助手.exe,目的就是为了买学浪课程的人可以随时随地的解除录屏限制 工具我已经…

Linux是怎么发送一个网络包的?

目录 摘要 1 从 send 开始 2 传输层 3 网络层 4 网络接口层 4.1 邻居子系统 4.2 网络设备子系统 4.3 软中断发送剩余的 skb 4.4 硬中断又触发软中断 总结 摘要 一个网络包的发送,始于应用层,经层层协议栈的封装,终于网卡。今天来循…

Java_21 完成一半题目

完成一半题目 有 N 位扣友参加了微软与力扣举办了「以扣会友」线下活动。主办方提供了 2*N 道题目,整型数组 questions 中每个数字对应了每道题目所涉及的知识点类型。 若每位扣友选择不同的一题,请返回被选的 N 道题目至少包含多少种知识点类型。 示例…

Acrobat Pro DC 2023 for Mac PDF编辑管理软件

Acrobat Pro DC 2023 for Mac是一款功能强大的PDF编辑和管理软件,旨在帮助用户轻松处理PDF文件。它提供了丰富的工具和功能,使用户可以创建、编辑、转换和注释PDF文件,以及填写和签署PDF表单。 软件下载:Acrobat Pro DC 2023 for …

机器学习全攻略:概念、流程、分类与行业应用案例集锦

目录 1.引言 2.从零开始认识机器学习:基本概念与重要术语 3.五步走:掌握机器学习项目执行的完整流程 3.1.问题定义与数据收集 3.2.数据预处理与特征工程 3.3.模型选择与训练 3.4.模型评估与优化 3.5.模型部署与监控 4.深入了解各类机器学习方法…

Monkey 和 TextMonkey ---- 论文阅读

文章目录 Monkey贡献方法增强输入分辨率多级描述生成多任务训练 实验局限结论 TextMonkey贡献方法移位窗口注意(Shifted Window Attention)图像重采样器(Image Resampler)Token Resampler位置相关任务(Position-Relate…

云计算探索-如何在服务器上配置RAID(附模拟器)

一,引言 RAID(Redundant Array of Independent Disks)是一种将多个物理硬盘组合成一个逻辑单元的技术,旨在提升数据存取速度、增大存储容量以及提高数据可靠性。在服务器环境中配置RAID尤其重要,它不仅能够应对高并发访…

实景三维技术:开启自然资源管理的新篇章

随着科技的不断进步,实景三维技术已经在多个领域得到了广泛的应用。而在自然资源管理领域,实景三维技术更是发挥着越来越重要的作用。本文将介绍实景三维在自然资源管理领域的应用,探讨其带来的优势和变革。一、什么是实景三维技术&#xff1…

MHA高可用-解决MySQL主从复制的单点问题

目录 一、MHA的介绍 1.什么是 MHA 2.MHA 的组成 2.1 MHA Node(数据节点) 2.2 MHA Manager(管理节点) 3.MHA 的特点 4. MHA工作原理总结如下: 二、搭建 MySQL MHA 实验环境 …

文献阅读:使用 CellChat 推理和分析细胞-细胞通信

文献介绍 「文献题目」 Inference and analysis of cell-cell communication using CellChat 「研究团队」 聂青(加利福尼亚大学欧文分校) 「发表时间」 2021-02-17 「发表期刊」 Nature Communications 「影响因子」 16.6 「DOI」 10.1038/s41467-0…