C语言结构体、位段、枚举、联合体

结构体:

定义:

                结构体就是一堆值的集合

初始化:

#include<stdio.h>
#include <stddef.h>
struct  S
{char ch;int n;
};int main()
{struct S s1 { 'a', 5 };S s2{ 'b',6 };printf("s1 ch:%c , n:%d\n", s1.ch, s1.n);printf("s2 ch:%c , n:%d\n", s2.ch, s2.n);return 0;
}

大小:

                结构体大小涉及到内存对齐问题:

内存对齐的规则:

ps:下文谈及的对齐数等于对应的数据类型大小

    • 1.第一个成员在与结构体变量偏移量为0的地址处。
    • 2.对齐基准:结构体的对齐数=min(默认对齐数),最大成员对齐数)

ps:默认对齐数根据编译器不同而不同,也可以自己设置 使用#pragma pack(n),设置n为默认对齐数

    • 3.成员对齐:每个成员必须放在其类型大小整数倍的地址(偏移地址)上
    • 4.结构体大小一定是结构体对齐数的整数倍

求sizeof(结构体)的运行结果:

内存对齐的优点:

1.提高CPU访问内存的效率,大多数CPU都是几个字节访问、避免一个数据要访问两次内存

例如:

2.方便平台兼容:有些平台不允许访问单个字节的数据,有些平台可以

位段:

定义:

        按照比特位分配空间的特殊结构体

初始化:

        1、成员变量必须是 int、unsigned int 或signed int类型 。

        2.位段的成员名后边有一个冒号和一个数字。

struct S
{int _a : 10;int _b : 30;
};

大小:

默认按照int大小(4字节==32比特)分配空间:

                        如果所有位段总位数 ≤ 32(4字节),则分配 4 字节。

                        如果总位数 > 32,则分配多个 int 单元。

如上图所示:S位段中总比特位为40,所以分配两个int单元

优缺点:

优点:

        可以很好地节省空间,网络协议报头的制定就常常使用位段结构体

缺点:

        不可跨平台,因为每个平台内存填充对齐规则不同

例如下图:

        两种不同的填充对齐方案,一种是不要剩余空间,进行内存对齐更重要,一种是充分利用剩余空间,两种方案的不同导致,同一种CPU访问内存取数据的策略,可能取出的数据不同,所以导致位段的不可跨平台性

枚举:

定义:

        常量的集合

初始化:

enum LOGLEVEL
{DEBUG=0,WARNING,ERROR,FATAL
};

常量的值默认从0开始,一次递增1,当然在定义的时候也可以赋初值

优点:

优点:

  • 增加代码的可读性和可维护性
  • 有类型检查(例如传参时),更严谨

ps:如果是宏定义常量,宏常量debug可以进入Func2,int类型的数据也能进入Func2,而用枚举定义的常量就会有类型检查,只能枚举的常量才能进入Func1函数中

  • 通过封装,避免了命名污染问题
  • 使用方便、一次性可以定义多个常量

联合体:

定义:

        联合体是成员是共用同一块内存空间的特殊结构体类型

初始化:

union u
{char c;int n;
};

大小:

规则:

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

        对于union u来说最大成员大小是n的大小为4个字节,而且由上文结构体中谈及的内存对齐规则可知,4为最大对齐数,所以正好最大成员大小是最大对齐数的整数倍,所以u大小为4个字节;

        对于union u2来说最大成员大小是c的大小为5个字节,而且由上文结构体中谈及的内存对齐规则可知,4为最大对齐数,所以正好最大成员大小不是最大对齐数的整数倍,所以要对齐到最大对齐数的整数倍,5就要对齐到8(4*2)

三、总结:

学会使用结构体、位段、枚举、联合体,了解他们的特点优势,可以增强项目工程代码的可读性、可维护性,掌握计算这些结构体的方法,恰当地分配结构体内存大小可以增强项目工程的效率,减少内存占用

还有一个简单的思维导图,方便大家复习巩固

结语:

        以上就是我分享的C语言特殊类型的全部内容了,希望对大家有些帮助,也希望与一样喜欢编程的朋友们共进步

谢谢观看

如果觉得还阔以的话,三连一下,以后会持续更新的,我会加油的

祝大家早安午安晚安

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

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

相关文章

AI产品经理面试宝典第61天:AI产品体验、数据安全与架构实战解析

1. 如何提升 AI 产品的用户体验? 1.1 问:如何提升 AI 产品的用户体验? 答: 提升 AI 产品的用户体验可以从以下几个方面入手: 可解释性增强:AI模型的输出往往较为“黑盒”,用户难以理解其决策逻辑。通过可视化、自然语言解释、关键特征展示等方式,增强用户对AI决策过程…

以微服务为基础搭建一套脚手架开始前的介绍

书接上回<java一个脚手架搭建-CSDN博客> 这个脚⼿架项⽬开发前&#xff0c;你要大概的了解一下这些东西&#xff1a; Java基础、IDEA使⽤、Maven基础 • Linux基础 • Springboot/Spring Cloud 基础 • MySQL基础 • Redis基础 • RabbitMQ基础 • Docker基础 • Git基…

Excel接入deepseek

先进入deepseek官网&#xff1a;DeepSeek | 深度求索 点击API开放平台&#xff1a; 确保余额里有钱: 创建APIkey: 复制到.txt文件中储存好 插入VBA代码&#xff1a; Function OptimizeEbayTitle(originalTitle As String) As StringDim Prompt As StringPrompt "作为…

【计组】概述

目录 计算机层次结构 计算机硬件 所有用户&#xff08;程序员&#xff09;可见 所有用户&#xff08;程序员&#xff09;透明 汇编程序员可见 计算机软件 从源程序到可执行文件 计算机性能指标 字长 运算速度 单位换算 存储 速率 时间 计算机层次结构 计算机硬件…

Web15题(7.28~8.3)

&#xff08;1&#xff09;SQL注入 [NSSRound#1 Basic]sql_by_sql 登录界面 尝试二次注入覆盖 admin 用户&#xff0c;但是发现注释符 # 被过滤了&#xff0c;--可以 但是无效了 奥原来是密码输错了 然后进行修改密码&#xff0c;修改以后就可以登录admin账户 查询按钮也不…

《Python 实用项目与工具制作指南》· 1.2 选择与配置Python代码编辑器

1.2 选择与配置 Python 代码编辑器 安装好 Python 环境后&#xff0c;我们还需要一款合适的代码编辑器来编写、运行和调试代码。就像作家需要趁手的钢笔&#xff0c;程序员也需要好用的编辑器 —— 它能帮你自动补全代码、高亮语法错误&#xff0c;让开发 “题目数据生成器”“…

Kali基础知识点【2】

Nmap信息收集nmap&#xff1a;网络扫描器&#xff0c;收集网络信息 openVAS:系统漏洞扫描器Nmap基础命令 nmap 目标主机&#xff1a;收集开放的端口 nmap -O 目标主机&#xff1a;收集目标主机的操作系统 nmap -sP 网段/子网掩码&#xff1a;扫描目标网段上开启的主机 nmap -sV…

Python自动化测试框架:Unittest 断言

&#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快断言是编程中常用的一种验证方法&#xff0c;也是测试代码中最重要的部分&#xff0c;用于验证某个条件是否为真&#xff0c;验证测试结果与预期结果是否一致。unit…

spring-ai-alibaba 学习(十八)——graph进阶

内容概述 前一篇&#xff08;spring-ai-alibaba 1.0.0.2 学习&#xff08;十七&#xff09;——初识graph-CSDN博客&#xff09;初步介绍了graph&#xff1a; 概念&#xff1a;图、边、节点、状态等&#xff0c;及其核心类和衍生类 使用流程&#xff1a; 1&#xff09;定义…

音视频学习(四十七):模数转换

模数转换&#xff08;Analog-to-Digital Conversion&#xff0c;简称ADC&#xff09;是将连续的模拟信号转换为离散的数字信号的过程&#xff0c;是现代电子系统中的核心技术之一。模数转换广泛应用于通信、信号处理、传感器数据采集、音频处理、图像处理等领域。 基本原理 模数…

8.高斯混合模型

高斯混合模型&#xff0c;简称GMM&#xff0c;对数据可以进行聚类或拟合&#xff0c;多用于传统语音识别。他会将每个数据看做多个高斯分布混合生成的。对于无标签的数据进行聚类&#xff0c;一般采用高斯混合模型处理。算法过程 1.首先进行初始猜测&#xff0c;假设有n个簇&am…

Calcite自定义扩展SQL案例详细流程篇

文章目录前言本章节源码一、基于 Calcite 实现一个自定义 SQL 解析器1.1、认识Calcite解析器二、实战案例2.1、快速构建一个可扩展sql语法的模板工程&#xff08;当前暂无自定义扩展sql示例&#xff09;步骤1&#xff1a;拉取calcite源码&#xff0c;复制codegen代码步骤2&…

【生活篇】Ubuntu22.04安装网易云客户端

前文啰嗦&#xff0c;直接跳转 命令行汇总 网易云linux版早已停止维护&#xff0c;自己一直在使用web版本&#xff0c;今天想下载个音乐&#xff0c;结果需要客户端。。。 安装命令很简单&#xff1a; wget https://d1.music.126.net/dmusic/netease-cloud-music_1.2.1_amd64…

FT8441S/FT8441A 5V非隔离方案电路原理图(型号解析及管脚定义)

在当今电子设备日益普及的背景下&#xff0c;高效、稳定且低成本的电源解决方案成为了众多工程师的追求目标。Fremont Micro Devices 推出的 FT8441S 和 FT8441A 正是这样两款满足需求的芯片&#xff0c;它们凭借高精度恒压输出、快速启动以及完善的保护功能&#xff0c;成为了…

Python 面向对象编程核心知识点深度解析

面向对象编程&#xff08;OOP&#xff09;是 Python 中最重要的编程范式之一&#xff0c;它将数据和操作数据的方法封装在一起&#xff0c;提高了代码的复用性和可维护性。本文将结合实际代码示例&#xff0c;详细讲解 Python 面向对象编程的核心概念和常用技巧。一、类与对象的…

Java学习第一百部分——Kafka

目录 一、前言提要 二、核心价值 三、核心架构 四、基本用途 五、优势总结 六、相关技术 七、详细用途 八、高级用法 九、最佳实践 十、总结定位 一、前言提要 Apache Kafka 是一个强大的开源分布式流处理平台&#xff0c;专为处理高吞吐量、低延迟的实时数据流而设计…

[spring-cloud: 负载均衡]-源码分析

获取服务列表 ServiceInstanceListSupplier ServiceInstanceListSupplier 接口是一个提供 ServiceInstance 列表的供应者&#xff0c;返回一个响应式流 Flux<List<ServiceInstance>>&#xff0c;用于服务发现。 public interface ServiceInstanceListSupplier e…

Oracle 在线重定义

Oracle 在线重定义&#xff08;Online Redefinition&#xff09; 是一种功能&#xff0c;通过DBMS_REDEFINITION 包提供&#xff0c;允许DBA在不需要停止或显著影响数据库正常操作的情况下&#xff0c;对数据库表进行结构化修改。可以实现的功能将表移动到其它表空间增加、修改…

Web 开发 12

1 网址里的 “搜索请求” 结构 这张图是在教你怎么看懂 网址里的 “搜索请求” 结构&#xff0c;特别基础但超重要&#xff0c;对你学前端帮别人做搜索功能超有用&#xff0c;用大白话拆成 3 步讲&#xff1a; 1. 先看「协议&#xff08;Protocol&#xff09;」 HTTPS 就是浏…

网络安全 | 如何构建一个有效的企业安全响应团队

网络安全 | 如何构建一个有效的企业安全响应团队 一、前言 二、团队组建的基础要素 2.1 人员选拔 2.2 角色定位 三、团队应具备的核心能力 3.1 技术专长 3.2 应急处置能力 3.3 沟通协作能力 四、团队的运作机制 4.1 威胁监测与预警流程 4.2 事件响应流程 4.3 事后复盘与改进机制…