typedef、共用体、枚举、存储类型、分文件编程详细内容
一、类型重定义typedeftypedef是C语言中的关键字用于为已有的数据类型定义一个新的名称别名。这可以提高代码的可读性和可维护性。1.1 基本用法语法格式typedef 原类型名 类型新名字;示例typedef unsigned int size_t;这样unsigned int a;和size_t a;就是等价的声明。1.2 重定义结构体类型1先定义结构体类型再重定义#include stdio.h struct student { int id; float score; }; int main(int argc, char const *argv[]) { typedef struct student STU; // 为struct student定义别名STU STU st; // 等价于 struct student st; STU *p st; // 等价于 struct student *p st; return 0; }2定义结构体同时进行重定义#include stdio.h typedef struct student { int id; float score; } STU; // 直接定义结构体并创建别名 int main(int argc, char const *argv[]) { STU st; // 直接使用别名 STU *p st; return 0; }1.3 typedef 和结构体指针#include stdio.h typedef struct student { int id; float score; } STU, *STP; // STU是结构体别名STP是指向该结构体的指针类型别名 int main(int argc, char const *argv[]) { STU st; // 结构体变量 STP p st; // 指针变量等价于 STU *p st; p-id 1; p-score 99.9; return 0; }判断规则根据结构体定义前是否有typedef关键字来判断定义的是变量还是类型。二、共用体联合体共用体union是一种特殊的数据类型允许在相同的内存位置存储不同的数据类型。所有成员变量共用同一块内存空间。2.1 定义格式union 共用体名 { 成员列表; };2.2 定义共用体变量语法union 共用体名 变量名;访问成员变量使用.运算符示例#include stdio.h union value { int a; char b; }; int main(int argc, char const *argv[]) { union value val; val.a 10; printf(val.a %d\n, val.a); // 输出10 val.b a; printf(val.b %c\n, val.b); // 输出a printf(val.a %d\n, val.a); // 输出97因为共用内存a的值被覆盖 return 0; }2.3 共用体特性所有成员共用一块地址空间修改一个成员会影响其他成员的值内存中的实际数据以最后一次赋值为准共用体的大小 ≥ 最大成员的大小需要满足内存对齐要求应用示例测试大小端#include stdio.h union value { int a; char b; }; int main(int argc, char const *argv[]) { union value val; val.a 0x12345678; if (val.b 0x78) { printf(小端存储Little Endian\n); } else if (val.b 0x12) { printf(大端存储Big Endian\n); } return 0; }三、枚举enum枚举是用户自定义的数据类型用于声明一组命名的整数常量提高代码可读性。3.1 定义格式enum 枚举类型名 { 常量1, 常量2, // ... };3.2 示例#include stdio.h enum Weekday { MONDAY 1, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY }; int main(int argc, char const *argv[]) { int day; printf(请输入星期几1-7); scanf(%d, day); switch (day) { case MONDAY: printf(今天是星期一\n); break; case TUESDAY: printf(今天是星期二\n); break; // ... 其他case default: printf(输入错误\n); break; } return 0; }注意事项如果没有显式赋值第一个枚举常量默认为0后续常量依次递增可以给每个元素单独赋值如果某个元素没有赋值则其值为上一个元素的值加1四、存储类型C语言中的存储类型决定了变量的存储位置、生命周期和作用域。4.1 auto自动类型默认的存储类型修饰局部变量通常省略不写。变量存储在栈区函数结束时自动释放。4.2 static静态类型可以修饰局部变量、全局变量和函数。存储位置静态区/全局区.data段存放已初始化的变量.bss段存放未初始化的变量初始化默认初始化为0只初始化一次生命周期修饰局部变量时延长其生命周期到程序结束作用域限制修饰局部变量限制在当前函数内使用修饰全局变量和函数限制在当前文件中使用示例#include stdio.h void fun() { static int a 0; // 只初始化一次 a; printf(a %d\n, a); } int main(int argc, char const *argv[]) { fun(); // 输出a 1 fun(); // 输出a 2 fun(); // 输出a 3 return 0; }4.3 extern外部引用类型extern用于声明在其他文件中定义的全局变量或函数使得在当前文件中可以使用这些外部定义的变量和函数。示例///////////////////////num.c/////////////////// #include stdio.h static int n 10; // static修饰后n不能被外部引用只能限制在本文件中使用 static void fun() { printf(hello\n); } /////////////////////main.c//////////////////// #include stdio.h extern int n; // 声明外部变量n extern void fun(); // 声明外部函数fun() int main(int argc, char const *argv[]) { printf(n %d\n, n); // 编译错误n在num.c中是static的无法外部引用 fun(); // 编译错误fun()在num.c中是static的无法外部引用 return 0; }编译与执行gcc num.c main.c ./a.out4.4 register寄存器类型register建议编译器将变量存储在CPU寄存器中以提高访问速度。特点不能对寄存器变量取地址操作因为寄存器没有内存地址由于寄存器数量有限编译器可能不会将所有register变量都放入寄存器中当寄存器不足时register变量会像auto变量一样存储在栈中示例#include stdio.h int main(int argc, char const *argv[]) { register int i; // 建议编译器将i存储在寄存器中 for (i 0; i 1000000; i) { // 频繁访问的循环变量适合使用register } // int *p i; // 错误不能对register变量取地址 return 0; }五、分文件编程分文件编程是C语言中组织大型项目的常用方法通过将代码分散到多个文件中提高代码的可维护性和可重用性。5.1 头文件.h文件头文件通常包含以下内容宏定义#define类型重定义typedef结构体、共用体、枚举的定义函数声明函数原型外部变量声明extern注意全局变量一般不会直接定义在头文件中以避免多重定义错误。5.2 源文件.c文件源文件包含以下内容函数的定义实现变量的定义包含main函数的文件main.c包含子函数的文件fun.c、utils.c等5.3 分文件编程示例头文件head.h////////////////////head.h///////////////////// #ifndef HEAD_H // 防止头文件被重复包含 #define HEAD_H #include stdio.h // 函数声明 int add(int a, int b); // 结构体定义 struct student { int id; float score; }; #endif // HEAD_H主文件main.c/////////////////main.c////////////////////// #include head.h // 使用双引号包含自定义头文件 int main(int argc, char const *argv[]) { int result add(3, 5); printf(3 5 %d\n, result); struct student stu; stu.id 1; stu.score 95.5; printf(学生ID%d成绩%.1f\n, stu.id, stu.score); return 0; }函数实现文件fun.c//////////////fun.c/////////////////// #include head.h // 函数定义 int add(int a, int b) { printf(计算 %d %d\n, a, b); return a b; }5.4 编译与执行编译命令gcc main.c fun.c -o program执行命令./program5.5#include引用方式区别和的区别引用方式查找顺序适用场景#include filename.h直接去系统目录编译器指定的头文件路径查找标准库头文件如stdio.h、stdlib.h#include filename.h1. 先在当前目录查找2. 如果找不到再去系统目录查找自定义头文件项目内的头文件5.6 分文件编程的优点模块化将相关功能组织在一起便于维护代码复用头文件可以被多个源文件包含编译效率修改单个文件时只需重新编译该文件团队协作不同开发者可以同时处理不同文件隐藏实现细节头文件只暴露接口保护实现细节

相关新闻

硬件序列器在嵌入式图像处理中的核心作用与SIMCOP实例解析

硬件序列器在嵌入式图像处理中的核心作用与SIMCOP实例解析

1. 项目概述与核心价值在嵌入式图像处理领域,尤其是汽车信息娱乐、高级驾驶辅助这类对实时性和能效要求极高的场景,CPU的通用计算能力常常成为瓶颈。当面对JPEG编解码、图像缩放、色彩空间转换等重复性高、计算密集的任务时,单纯依赖软件算法…

2026/7/24 7:32:18 阅读更多 →
游戏上线RoadMap:从压力测试到容灾演练的完整指南

游戏上线RoadMap:从压力测试到容灾演练的完整指南

1. 游戏上线RoadMap的核心价值游戏行业有句老话:"上线只是开始,炸服才是常态"。我经历过三次大型游戏上线,最惨痛的一次开服5分钟就崩溃,玩家流失率高达78%。这份血泪教训换来的RoadMap,将帮你避开90%的常见…

2026/7/24 2:49:41 阅读更多 →
sig与stern集成:Kubernetes日志实时搜索的终极工具

sig与stern集成:Kubernetes日志实时搜索的终极工具

sig与stern集成:Kubernetes日志实时搜索的终极工具 【免费下载链接】sig Interactive grep (for streaming) 项目地址: https://gitcode.com/gh_mirrors/si/sig 在Kubernetes日常运维中,实时日志监控与搜索是定位问题的关键环节。sig作为一款交互…

2026/7/22 22:37:55 阅读更多 →

最新新闻

AI Agent基础设施层:2026年竞争格局与技术突破

AI Agent基础设施层:2026年竞争格局与技术突破

1. AI Agent竞争格局的演变趋势2026年的AI Agent领域正在经历一场深刻的范式转移——竞争焦点从模型层向基础设施层的迁移。这个转变背后是行业发展的必然逻辑:当基础模型能力逐渐趋同,决定AI Agent实际表现的关键因素变成了支撑其运行的底层架构。就像智…

2026/7/24 12:03:01 阅读更多 →
AI教材生成工具:核心技术解析与高效应用指南

AI教材生成工具:核心技术解析与高效应用指南

1. 项目概述:AI教材生成工具的核心价值 去年帮某教育机构做课程开发时,我深刻体会到传统教材编写的痛点:团队花费三个月编写的200页教材,查重率竟高达38%。这促使我开始系统研究AI辅助教材生成方案。当前市面上的工具已能实现72小…

2026/7/24 12:03:01 阅读更多 →
AI服装模特试穿详情图生成系统开发

AI服装模特试穿详情图生成系统开发

技术架构与工具选择编辑𝗩:araolin(私域邦网络土土哥)3D建模与姿态生成 使用Blender、DAZ 3D或MakeHuman创建基础服装模特模型,结合OpenPose或AlphaPose提取人体关键点,实现多样化姿态模拟。Unity或Unreal …

2026/7/24 12:03:01 阅读更多 →
Langflow 系列 | 第 1 篇:Langflow 是什么,以及它解决什么问题

Langflow 系列 | 第 1 篇:Langflow 是什么,以及它解决什么问题

摘要 Langflow 是一个面向 AI Agent 与工作流编排的可视化开发平台。它把模型调用、提示词、工具、数据处理、向量数据库、知识库、Agent 编排和外部服务集成抽象成可连接的组件,让开发者可以用图形化方式构建 AI 应用,并将构建好的 Flow 发布为 API、MC…

2026/7/24 12:03:01 阅读更多 →
Docker Compose 部署 Apache Superset:轻松搭建开源 BI 平台

Docker Compose 部署 Apache Superset:轻松搭建开源 BI 平台

*本文基于 apache/superset 镜像 6.1.0-dev,配套 Postgres 17 Redis 7。 运营要周报大盘、产品要漏斗转化、老板要「打开浏览器就能看数」——很多团队会先把报表绑在商业 SaaS BI 上:按席位 / 按查询量计费,看板一多成本就上去;…

2026/7/24 12:03:01 阅读更多 →
高光谱图像超分辨率:几何增强小波扩散模型解析

高光谱图像超分辨率:几何增强小波扩散模型解析

1. 项目概述:高光谱图像超分辨率的几何增强小波扩散模型 高光谱图像(HSI)超分辨率是遥感领域的一项关键技术挑战。传统方法在处理HSI时面临三大核心难题:首先,高光谱数据的高维度特性导致内存消耗巨大,常规…

2026/7/24 12:02:01 阅读更多 →

日新闻

用Highcharts 创建可拖拽三维散点立方体3D图表

用Highcharts 创建可拖拽三维散点立方体3D图表

该案例基于Highcharts scatter3d 三维散点图实现空间立方体散点可视化,核心特色:三维 X/Y/Z 三轴空间,所有散点分布在 0~10 立方体空间内;散点使用径向渐变实现立体 3D 圆球质感;支持鼠标 / 触屏拖拽画布,…

2026/7/24 0:00:29 阅读更多 →
AppCertDlls:进程创建路径上的 DLL 入口

AppCertDlls:进程创建路径上的 DLL 入口

AppCertDlls:进程创建路径上的 DLL 入口 AppCertDlls 位于 HKLM\System\CurrentControlSet\Control\Session Manager\AppCertDlls。本文的程序功能是只读列出这个键在 64 位和 32 位注册表视图中的全部值,并显示每条值的来源、名称、类型和可安全显示的数…

2026/7/24 0:00:29 阅读更多 →
我的编程之路:第一篇博客

我的编程之路:第一篇博客

大家好,我是一名编程初学者,同时这也是我编程学习之路上的第一篇博客。在这里,我想要向大家介绍我的一些想法和规划。a.自我介绍我是一个刚刚接触编程的新手,目前在学习c语言,我对编程世界充满了强烈的好奇。当然&…

2026/7/24 0:00:29 阅读更多 →

周新闻

Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中,我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源,还是配置文件、证书等,都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下,但这…

2026/7/24 3:59:20 阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP(轻量级目录访问协议)作为企业级身份认证的黄金标准,已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时,发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/24 1:23:39 阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击: https://intelliparadigm.com 第一章:AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”,而是以可解释、可审计、可迭代的方式,赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/23 17:49:47 阅读更多 →

月新闻