C语言基础(14):结构体、共用体与枚举
一、结构体1.1 为什么需要结构体假设要实现一个学生管理系统需要存储每个学生的姓名、年龄、成绩。如果用数组来管理char name[30][20]; // 30个学生的姓名 int age[30]; // 30个学生的年龄 int score[30]; // 30个学生的成绩数据被分散在多个数组中既不直观也不方便管理。结构体可以把相关联的不同类型的数据组合在一起形成一个新的数据类型。1.2 结构体类型的定义struct 结构体名 { 成员1; 成员2; ... };示例定义一个学生类型struct student { char name[20]; int age; float score; };各部分说明部分说明struct关键字用来说明是结构体类型student结构体名是新构造出来的类型的名称属于标识符符合标识符命名规则{}内部成员列表每个成员可以是不同类型此时struct student就是一个完整的类型名可以像基本类型一样使用。1.3 结构体变量的定义定义好结构体类型之后就可以像基本类型一样使用定义变量、定义数组、定义指针、做函数返回值类型等。三种定义方式方式一先定义类型再定义变量推荐struct stu { char name[20]; int age; float score; }; // 先定义结构体类型 struct stu s; // 再定义变量方式二定义类型的同时定义变量struct stu { char name[20]; int age; float score; } s {tom, 18, 99.5};如果结构体定义在全局则相当于定义了一个全局变量。方式三直接定义结构体类型变量匿名结构体struct { char name[20]; int age; float score; } s {tom, 18, 99.5};这种写法一般在结构体类型只用一次的时候使用。1.4 结构体的初始化按照成员顺序逐个初始化struct student s {tom, 18, 99.5};给结构体输入数据时只能给到具体的成员变量。1.5 结构体成员的访问使用结构体成员运算符.结构体变量名.结构体成员变量名 s.name // 访问结构体成员 name s.age // 访问结构体成员 age s.score // 访问结构体成员 score1.6 结构体的注意事项1同类型结构体变量之间可以相互赋值struct student s1 {tom, 18, 99.5}; struct student s2 s1; // ✅ 同类型可以直接赋值2结构体作为函数参数时传结构体变量的地址一般不传结构体变量本身因为结构体可能很大传值会复制整个结构体效率低。3通过指针访问结构体成员使用指向结构体成员运算符-用于结构体类型的指针struct student s {tom, 18, 99.5}; struct student *p s; // 以下两种写法等价 p-name // 通过指针访问推荐 (*p).name // 先解引用再用 . 访问1.7 结构体的大小——内存对齐结构体变量定义后需要开辟空间那么结构体的空间有多大这是考点。结构体对齐规则规则一成员的自身对齐每个成员先在自己的自然边界对齐类型对齐要求char任意地址short能被 2 整除的地址int能被 4 整除的地址long能被 4 整除的地址规则二整个结构体的对齐整个结构体的大小必须是最大成员大小的整数倍。struct example { char a; // 1 字节 int b; // 4 字节 char c; // 1 字节 }; // sizeof(struct example) 12而不是 6 // 因为 int 要求 4 字节对齐整个结构体大小要对齐到 4 的倍数二、共用体2.1 什么是共用体共用体union中所有成员共享同一块内存空间。int a; float b; char c; // 这三个变量使用同一块空间2.2 共用体的定义union 共用体名 { 成员1; 成员2; ... };示例union demo { int a; float b; char c; };2.3 共用体的注意事项编号注意点1共用体的大小 最大成员的大小2共用体初始化时只能给一个值这个值给第一个成员3所有成员的起始地址是相同的4如果给成员赋值成员中的值取决于最后赋值后的效果后写的覆盖先写的2.4 共用体的应用判断大小端大端模式数据的高位字节存放在低地址处。小端模式数据的低位字节存放在低地址处。利用共用体可以判断电脑是大端还是小端#include stdio.h int isLittleEndian() { union endian { int a; char c; } u; u.a 1; return u.c; // 如果 c 1说明低位字节在低地址小端 } int main() { if (isLittleEndian()) printf(小端模式\n); else printf(大端模式\n); return 0; }2.5 共用体的实际用途节省空间当一个成员不可能同时出现时如学生有成绩老师有工资但一个人不可能既是学生又是老师可以用共用体节省空间struct member { char name[20]; int age; union { float score; // 学生的成绩 float salary; // 老师的工资 } data; }; struct member s; strcpy(s.name, tom); s.age 20; s.data.score 99.5; // 作为学生使用 score2.6 共用体的使用范围有了共用体类型之后可以像基本类型一样定义共用体变量定义共用体指针变量定义共用体数组作为函数的形参作为函数返回值类型三、枚举3.1 什么是枚举如果一个变量只有几种可能的值则可以定义为枚举类型。所谓枚举是指将变量的值一一列举出来变量的值只限于列举出来的值的范围内。典型场景交通信号灯只有三种状态RED GREEN YELLOW如果用数字表示0代表红灯1代表绿灯...代码中到处都是数字可读性很差——这些数字就叫魔数幻数。枚举可以解决这个问题。3.2 枚举的作用1.提高代码可读性——用有意义的名称代替数字。2.把有关联的数值放到一起——进一步提高代码可读性。3.3 枚举类型的定义enum 枚举名 { 枚举常量1, 枚举常量2, ... };示例enum light { CMD_RED, CMD_GREEN, CMD_YELLOW, };3.4 枚举的注意事项编号注意点1枚举常量的值默认从 0 开始也可以自己指定值。指定了值之后后续常量的值接着这个值依次递增2枚举类型最终实际上是用int型来实现的3枚举类型对比宏定义都能提高代码可读性但枚举是有类型的作用在编译阶段宏定义没有类型作用在预处理阶段enum light { CMD_RED 0, // 默认 0 CMD_GREEN, // 自动为 1 CMD_YELLOW 10, // 手动指定 10 CMD_BLUE, // 自动为 11 };3.5 枚举的使用enum light state CMD_RED; if (state CMD_RED) { printf(红灯停\n); }3.6 练习从键盘输入星期 1 到星期 7打印对应的英文enum week { MON 1, TUE, WED, THU, FRI, SAT, SUN, }; int main() { int day; scanf(%d, day); switch (day) { case MON: printf(Monday\n); break; case TUE: printf(Tuesday\n); break; case WED: printf(Wednesday\n); break; case THU: printf(Thursday\n); break; case FRI: printf(Friday\n); break; case SAT: printf(Saturday\n); break; case SUN: printf(Sunday\n); break; default: printf(输入错误\n); break; } return 0; }四、三种自定义类型对比对比项结构体struct共用体union枚举enum用途将不同类型的数据组合在一起多个成员共享同一块空间变量只有几种固定取值内存各成员各有自己的空间所有成员共享一块空间底层用int实现大小所有成员大小之和含对齐最大成员的大小sizeof(int) 4关键字structunionenum典型场景学生信息、日期、坐标节省内存、大小端判断信号灯、星期、颜色五、总结知识点核心要点结构体定义struct 结构体名 { 成员列表; };先定义类型再定义变量结构体初始化按成员顺序逐个初始化结构体访问.运算符访问成员-运算符通过指针访问成员结构体大小考虑内存对齐成员自身对齐 整体按最大成员对齐结构体赋值同类型结构体变量可直接赋值结构体传参一般传地址指针不传整个结构体变量共用体所有成员共享同一块空间大小为最大成员后赋值的覆盖前面的共用体应用判断大小端、节省空间枚举默认从 0 开始可自定义值底层用 int 实现枚举 vs 宏枚举有类型编译阶段起作用宏没有类型预处理阶段起作用

相关新闻

六角晶格BIC合并行为的COMSOL仿真与品质因子优化

六角晶格BIC合并行为的COMSOL仿真与品质因子优化

1. 项目概述:六角晶格BIC合并行为的仿真探索最近在光子晶体和超表面研究中,连续域束缚态(Bound states in the continuum, BIC)因其特殊的物理性质备受关注。这次我用COMSOL Multiphysics复现了六角晶格中高阶BIC参与的合并行为&a…

2026/10/4 13:24:04 阅读更多 →
Kimi K3 新手入门,从注册到写出第一个网页游戏

Kimi K3 新手入门,从注册到写出第一个网页游戏

为什么 Kimi K3 能让新手直接写出游戏? 最近技术圈最热闹的话题,莫过于 Kimi K3 的横空出世。对于很多刚接触大模型、甚至编程基础薄弱的朋友来说,这可能是一个“降维打击”般的时刻。以前我们觉得写一个能玩的网页游戏,需要懂 HT…

2026/10/4 14:55:15 阅读更多 →
AI编程工具如何提升易语言开发效率:从原理到实战

AI编程工具如何提升易语言开发效率:从原理到实战

如果你还在用传统方式写易语言代码,可能已经落后了。最近AI编程工具正在快速改变开发方式,特别是对于易语言这类相对小众但用户基数庞大的开发环境。传统易语言开发面临的最大痛点是什么?不是语法复杂,而是重复性代码多、调试周期…

2026/10/4 14:55:09 阅读更多 →

最新新闻

隔离内网AI Agent落地方案:从模型选型到并发压测全指南

隔离内网AI Agent落地方案:从模型选型到并发压测全指南

把 AI Agent 推进隔离内网的时候,我最直观的感受是:网上那些 Agent 演示项目,到了内网几乎没有一个能直接跑起来。这不是代码写得不行,而是它们默认的世界里什么都有——模型权重从 HuggingFace 拉、Python 依赖从 PyPI 装、搜索工…

2026/10/5 14:40:16 阅读更多 →
本地部署大模型:Token自由与数据主权的成本交叉点

本地部署大模型:Token自由与数据主权的成本交叉点

1. 从一张显卡账单说起:为什么企业开始重新算这笔账去年底帮一家做工业质检的客户做技术选型,他们的场景很典型:每天要处理大约两万张缺陷样本图,每张图都要过一遍多模态模型做描述生成和分类打标。一开始走的是公有云API&#xf…

2026/10/5 14:40:16 阅读更多 →
Windows下TensorFlow GPU版安装指南:CUDA与cuDNN版本匹配全解析

Windows下TensorFlow GPU版安装指南:CUDA与cuDNN版本匹配全解析

1. 写在动手之前:TensorFlow GPU版本没那么玄,坑全在版本匹配TensorFlow装GPU版本,十个新手九个在环境上翻车。这活儿本身不复杂,但坑全藏在版本匹配里:显卡驱动、CUDA、cuDNN、Python、TensorFlow本体,五个…

2026/10/5 14:40:16 阅读更多 →
Windows安装TensorFlow GPU版全攻略:CUDA/cuDNN版本匹配与报错排查

Windows安装TensorFlow GPU版全攻略:CUDA/cuDNN版本匹配与报错排查

Windows上装TensorFlow GPU版,说实话不算难,但坑是真的多。很多朋友卡在最后一步,pip install成功,import的时候直接报错,日志里全是什么cudart64_110.dll、cublas64_11.dll找不到,一看就是CUDA和cuDNN版本…

2026/10/5 14:40:15 阅读更多 →
Python登录接口实战:从密码加密到Session/Token登录态保持

Python登录接口实战:从密码加密到Session/Token登录态保持

做登录接口,算是Python后端入门里最典型、也最容易被低估的一个练习。项目名里带着“携程登陆”,说明不少人是想拿真实网站当靶子练手,这个思路没错,但我的建议是:先别急着去模拟别人家的登录,先自己用Pyth…

2026/10/5 14:40:15 阅读更多 →
零售数仓实战:促销敏感度与评论敏感度建模全解析

零售数仓实战:促销敏感度与评论敏感度建模全解析

做了不少零售行业的数仓项目,说实话,像“促销敏感度”和“评论敏感度”这类需求,几乎每个做电商或品牌方数据团队都会接到。老板们通常不会直接说“我要建个模型”,而是扔过来几个很现实的问题:为什么这波满减发出去&a…

2026/10/5 14:39:14 阅读更多 →

日新闻

马斯克杀回智能体战场,Grok 4.5万亿参数撑腰,Cursor接手数字白领项目:用TaoToken统一Key跑通多模型Agent工作流

马斯克杀回智能体战场,Grok 4.5万亿参数撑腰,Cursor接手数字白领项目:用TaoToken统一Key跑通多模型Agent工作流

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/5 0:00:22 阅读更多 →
AI编程工具插件机制详解:plugin.json配置与加载失败排查指南

AI编程工具插件机制详解:plugin.json配置与加载失败排查指南

1. 从“plugins”这个词说起:它到底在解决什么问题如果你最近在折腾 AI 编程工具,尤其是 Cursor、Codex CLI、Claude Code 这类带 CLI 的编辑器或命令行助手,那你大概率绕不开一个词——plugins。这个词本身不新鲜,从浏览器到 IDE…

2026/10/5 0:00:23 阅读更多 →
第26课:OpenClaw|日志审计与问题诊断:把日志链路改到 TaoToken 的排查清单

第26课:OpenClaw|日志审计与问题诊断:把日志链路改到 TaoToken 的排查清单

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/5 0:00:23 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/5 5:06:42 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/5 1:10:22 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/5 3:06:17 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 11:40:45 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 9:43:54 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 20:14:29 阅读更多 →