在 C 语言编程中,结构体(struct)、共用体(union)与枚举(enum)是三种非常重要的用户自定义数据类型。它们能帮助我们更好地组织、管理和表达复杂的数据结构。本文将结合实例,深入介绍它们的概念、用法以及注意事项。


一、结构体(struct)

1. 什么是结构体

结构体是 C 语言提供的一种 用户自定义数据类型,它允许我们将不同类型的数据组合在一起,从而描述复杂的实体,例如学生、老师、网络协议等。

特点:

  • 可以包含不同类型的成员变量

  • 成员之间在内存中独立存在

  • 可定义为变量、数组、指针、函数参数或返回值类型

示例:

struct student {int sno;        // 学号char name[20];  // 姓名float score;    // 成绩char sex;       // 性别
};

2. 定义与使用

结构体有多种定义形式:

形式1:

struct demo {int a;float b;
};
struct demo d; // 定义变量

形式2:

struct demo {int a;float b;
} d = {1, 3.14};

形式3(一次性结构体):

struct {int a;float b;
} d = {1, 3.14};

3. 成员访问
  • . 运算符:结构体变量访问成员

  • -> 运算符:结构体指针访问成员

struct student s1 = {1001, "Tom", 95.5, 'M'};
printf("%s\n", s1.name);       // .
struct student *p = &s1;
printf("%s\n", p->name);       // ->

4. 初始化与赋值
  • 初始化需按成员顺序

  • 相同类型的结构体变量可直接赋值

  • 成员变量赋值需按其本身的类型方式

struct student s1 = {1001, "Tom", 95.5, 'M'};
struct student s2;
s2 = s1; // 整体赋值

5. 结构体作为函数参数
  • 可传递结构体变量(不推荐,开销大)

  • 推荐传递结构体指针(效率高)

void printStudent(struct student *p) {printf("%d %s %.2f %c\n", p->sno, p->name, p->score, p->sex);
}

6. 内存对齐

结构体在内存中会进行 自然边界对齐

  1. 每个成员变量按其类型大小对齐

  2. 整个结构体的大小按最大成员的对齐数对齐

示例:

struct demo1 {char a;  // 1字节char b;  // 1字节int c;   // 4字节
}; // 占 8 字节struct demo2 {char a;  // 1字节int b;   // 4字节char c;  // 1字节
}; // 占 12 字节

二、共用体(union)

1. 概念

共用体是一种特殊的自定义类型,它的 所有成员共用同一段内存空间。节省空间,但同一时间只能存储一个成员的值。

union demo {char  a;short b;int   c;
};

特点:

  • 大小由最大成员决定

  • 所有成员起始地址相同

  • 最后一次赋值会覆盖之前的数据

应用示例:

  • 检测大小端

  • 数据协议解析


三、枚举(enum)

1. 概念

枚举用于表示一组有限的常量值,增强代码可读性与类型检查。

enum Weekday {MON, TUE, WED, THU, FRI, SAT, SUN
};
  • 默认从 0 开始递增

  • 本质是 int 类型

  • 相比 #define,枚举有类型检查,更安全


四、综合应用案例

人员信息结构:

struct member {int no;char name[10];union {float score;float salary;} data;
};struct member stu = {119, "Tom", 98.5};
printf("no = %d\n", stu.no);
printf("name = %s\n", stu.name);
printf("score = %f\n", stu.data.score);

总结

  • 结构体:描述复杂实体,适用于多类型组合存储

  • 共用体:节省内存,适用于互斥存储场景

  • 枚举:提高可读性与类型安全

在实际开发中,结构体、共用体和枚举往往配合使用,例如在网络协议解析、设备驱动、嵌入式开发中,能大幅提高程序的可维护性与可扩展性。


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

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

相关文章

Linux Web服务器与WordPress部署笔记

web服务器 nginx 配置基本认证 用户名和密码使用plain text发送,所以最好配置SSL/TLS。 # 安装工具[rootserver ~ 09:21:43]# yum -y install httpd-tools[rootserver ~ 09:28:30]# vim /etc/nginx/conf.d/ssl.confserver {​location /auth-basic/ {auth_basic …

贪心----3. 跳跃游戏 II

45. 跳跃游戏 II - 力扣(LeetCode) /** 维护变量: max_reachable,遍历过的元素的最远可达位置 end,当前区间终点(随max_reachable变化) 遍历过程: 遍历时迭代遍历过的元素最远可达位置,利用end记录当前区间终点(随max_reachable变化) 当移动至end即当前…

RabbitMQ面试精讲 Day 13:HAProxy与负载均衡配置

【RabbitMQ面试精讲 Day 13】HAProxy与负载均衡配置 开篇 欢迎来到"RabbitMQ面试精讲"系列的第13天!今天我们将聚焦RabbitMQ集群架构中的关键组件——HAProxy及其负载均衡配置。在大型分布式系统中,如何实现RabbitMQ集群的高可用和负载均衡是…

C# 中常用集合以及使用场景

1. 数组 (Array)‌‌特点‌&#xff1a;固定大小、内存连续、访问速度快‌使用场景‌&#xff1a;需要高性能的固定大小集合数值计算&#xff08;如矩阵运算&#xff09;存储已知长度的数据&#xff08;如配置文件参数&#xff09;‌2. List<T>‌‌特点‌&#xff1a;动态…

量化实战学习 Day 2:双均线策略实现与回测分析

一、前言在完成第一天的环境搭建和基础认知后&#xff0c;今天将进入真正的策略开发环节。本文将记录我从数据处理到第一个量化策略实现的全过程&#xff0c;包含完整的代码示例和深度思考。二、复习与环境检查1.1 环境复查首先确认了Day 1搭建的环境运行正常&#xff1a; cond…

ubuntu 安装内核模块驱动 DKMS 介绍

DKMS&#xff08;Dynamic Kernel Module Support&#xff0c;动态内核模块支持&#xff09;是一个用于管理 Linux 内核模块的工具&#xff0c;主要作用是在系统内核更新时&#xff0c;自动重新编译和安装依赖于特定内核版本的驱动程序&#xff08;内核模块&#xff09;&#xf…

adb使用指南

adb使用指南一、介绍二、连接一、有线连接方式二、无线连接方式**Android 10及以下版本****Android 11及以上版本**三、指令1、设备连接管理2、应用调试3、文件传输4、系统控制6、日志分析7、其他速查表总结python脚本实例&#xff1a;提示&#xff1a;以下是本篇文章正文内容&…

C语言实战:二级指针与文件操作的完美邂逅——动态管理文件数据

资料合集下载链接: ​https://pan.quark.cn/s/472bbdfcd014​ 在上一篇文章中,我们探讨了二级指针作为函数“输出特性”的强大功能。今天,我们将更进一步,通过一个完整的实战项目,将二级指针与文件I/O操作结合起来,学习如何动态、高效地读取和管理文件内容。 这个项目…

低代码开发实战案例,如何通过表单配置实现数据输入、数据存储和数据展示?

JVS低代码轻应用快速开发采用所见即所得的配置思路&#xff0c;表单是低代码中最基础的业务配置引擎之一&#xff0c;快速的通过表单配置实现数据输入、数据存储&#xff0c;数据展示。那么在轻应用下直接点开菜单打开的表单&#xff0c;录入数据提交到数据模型&#xff0c;后续…

数字孪生系统让汽车工厂虚实联动预测维护少停机

在汽车制造行业&#xff0c;设备突发停机往往会引发连锁反应&#xff0c;导致生产中断、成本飙升。传统运维模式依赖人工巡检与事后维修&#xff0c;难以应对复杂生产场景下的设备管理需求。如今&#xff0c;数字孪生系统凭借虚实联动的核心能力&#xff0c;为汽车工厂打造预测…

iceberg1.2.0 修改表与覆盖写

版本iceberg 1.2.0修改表只支持HiveCatalog表修改表属性&#xff0c;Iceberg表属性和Hive表属性存储在HMS中是同步的修改外部表删表时是否删除数据的表属性&#xff0c;这里是修改为删除表时不删除数据alter table iceberg_test1 set TBLPROPERTIES(external.table.purgeFALSE)…

Mini-Omni: Language Models Can Hear, Talk While Thinking in Streaming

2024.8tsinghuamethodwhisper encoder: whisper smallLLM Qwen0.5b init预测方式&#xff1a;text 7*audio token&#xff0c; parallel generation的方式预测&#xff0c;delay-step1----先预测文本token&#xff0c;再预测SNAC 第一级码本&#xff0c;然后序列化的逐渐预测后…

【MATLAB例程】基于UKF的IMM例程,模型使用CA(匀加速)和CT(协调转弯)双模型,二维环境下的轨迹定位。附代码下载链接

本文介绍的MATLAB程序可以实现&#xff1a;基于交互式多模型&#xff08;IMM&#xff09;的无迹卡尔曼滤波&#xff08;UKF&#xff09;方法&#xff0c;用于二维平面中目标的运动状态估计。该算法结合了两个运动模型&#xff1a;匀速直线模型&#xff08;CV&#xff09;和匀速…

工厂智慧设备检测:多模态算法提升工业安全阈值

工厂智慧设备检测&#xff1a;从技术突破到场景化落地在工业4.0与智能制造的双重驱动下&#xff0c;工厂设备检测正经历从人工巡检到智能化监控的颠覆性变革。传统检测方式受限于人力成本、环境干扰及响应延迟&#xff0c;难以满足现代工厂对安全性、效率与可持续性的要求。而基…

复现论文《地形遮挡对GNSS干扰范围影响的高效仿真算法》

地形遮挡对GNSS干扰范围影响的高效仿真算法 1. 论文标题 论文标题为《地形遮挡对GNSS干扰范围影响的高效仿真算法》 2. 内容概括 该论文提出了一种高效计算地形遮挡对全球导航卫星系统(GNSS)干扰源干扰范围影响的新算法。传统基于视线可视域分析的方法存在大量冗余计算,本…

图论(2)算法之拓扑排序介绍

目录 一、什么是拓扑排序&#xff1f; 二、拓扑排序的算法实现 1 BFS算法实现 &#xff08;1&#xff09;算法思路 &#xff08;2&#xff09; 代码实现&#xff08;Java&#xff09; 2 DFS算法实现 &#xff08;1&#xff09;算法思路 &#xff08;2&#xff09; 代码实…

GoBy 工具联动 | GoBy AWVS 自动化漏扫工作流

GoBy 系统笔记导航 &#x1f680;&#xff1a;[网安工具] Web 漏洞扫描工具 —— GoBy 使用手册 AWVS 系统笔记导航 &#x1f680;&#xff1a;[网安工具] Web 漏洞扫描工具 —— AWVS 使用手册 0x01&#xff1a;GoBy AWVS —— 联动扫描简介 AWVS 是一款由 Acunetix 公司开…

《汇编语言:基于X86处理器》第13章 高级语言接口(1)

与C、c&#xff0c;Java等高级语言相比&#xff0c;汇编开发的效率偏低和维护成本偏高。大型的项目已经很少用汇编语言了&#xff0c;但并不是说汇编语言就完全没有用处了&#xff0c;在某些特定的领域&#xff0c;汇编语言还是很有用处的&#xff0c;比如配置硬件驱动器&#…

JVM基础【Java】

JVM基础 JVM&#xff1a;Java Virtual Machine(Java虚拟机&#xff09; 1.Java文件的执行流程 首先认识Java文件的运行规则对字节码文件进行解释成机器码&#xff0c;让计算机执行内存管理 自动为对象、方法等分配内存自动垃圾回收机制&#xff0c;回收不再使用的对象 即时编译…

ISL9V3040D3ST-F085C一款安森美 ON生产的汽车点火IGBT模块,绝缘栅双极型晶体管ISL9V3040D3ST汽车点火电路中的线圈驱动器

ISL9V3040D3ST-F085C 是一款 安森美 &#xff08;ON&#xff09;生产的汽车点火 IGBT模块&#xff08;绝缘栅双极型晶体管&#xff09;&#xff0c;主要用于汽车点火电路中的线圈驱动器&#xff0c;具有内部二极管电压箝位功能&#xff0c;可减少外部组件需求。‌ 核心用途 该…