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/21 20:51:17阅读更多 →
RTEMS实时操作系统:嵌入式系统开发者的终极指南

RTEMS实时操作系统:嵌入式系统开发者的终极指南

RTEMS实时操作系统:嵌入式系统开发者的终极指南 【免费下载链接】rtems Mirror only see https://gitlab.rtems.org/rtems/rtos/rtems 项目地址: https://gitcode.com/gh_mirrors/rt/rtems RTEMS(Real-Time Executive for Multiprocessor Systems…

2026/7/21 20:49:16阅读更多 →
为什么FreeType是全球最受欢迎的字体渲染引擎?揭秘其核心优势与应用场景

为什么FreeType是全球最受欢迎的字体渲染引擎?揭秘其核心优势与应用场景

为什么FreeType是全球最受欢迎的字体渲染引擎?揭秘其核心优势与应用场景 【免费下载链接】freetype Official mirror of https://gitlab.freedesktop.org/freetype/freetype 项目地址: https://gitcode.com/gh_mirrors/free/freetype FreeType是一款功能强大…

2026/7/21 20:49:16阅读更多 →
计算机毕业设计之基于springboot的乡镇普法宣传系统

计算机毕业设计之基于springboot的乡镇普法宣传系统

随着人们生活水平的提高和思想观念的转变,以及经济全球化的推动,互联网技术在社会综合发展中的应用日益广泛,突破了传统管理方式的局限性。乡镇普法宣传作为提升公民法律素养的重要途径,亟需更高效、便捷的管理手段。基于Spring B…

2026/7/22 0:17:23阅读更多 →
Go 高性能网关并发模型复盘:从 3000 QPS 到 28000 QPS 的协程调度优化实录

Go 高性能网关并发模型复盘:从 3000 QPS 到 28000 QPS 的协程调度优化实录

Go 高性能网关并发模型复盘:从 3000 QPS 到 28000 QPS 的协程调度优化实录 一、网关上线即告急:10 万连接下的协程爆炸 团队自研的 API 网关在一次灰度压测中暴露了严重的并发瓶颈。模拟 10 万并发连接的场景下,QPS 仅维持在 3000 左右&#…

2026/7/22 0:17:23阅读更多 →
物流系统架构设计全揭秘:从订单追踪到实时调度的技术选型与演进

物流系统架构设计全揭秘:从订单追踪到实时调度的技术选型与演进

物流系统架构设计全揭秘:从订单追踪到实时调度的技术选型与演进 一、物流系统的核心技术矛盾:一致性与实时性的双重要求 物流系统的架构挑战在于一个根本矛盾:订单状态的一致性要求和调度决策的实时性要求不可兼得。一笔快递订单的状态变更&a…

2026/7/22 0:17:23阅读更多 →
计算机毕业设计之基于springboot的校园兼职系统

计算机毕业设计之基于springboot的校园兼职系统

由于移动应用技术的持续性的快速发展,现实生活中人们大多数都是通过移动手机、电脑等智能设备来完成生活中的事务。因此,许多的人工传统行业也开始与互联网结合,不再一味的依靠人工手动,努力打造半自动数字化甚至是全自动数字化模…

2026/7/22 0:17:23阅读更多 →
【数据结构】孩子兄弟与二叉链表的本质统一

【数据结构】孩子兄弟与二叉链表的本质统一

孩子兄弟表示法 和 二叉链表表示法 在数据结构定义和物理存储上完全一样,它们是同一事物的两种不同名称,只是强调了不同的视角和应用场景。核心等价性它们都使用以下相同的节点结构(以C语言为例):typedef struct Node …

2026/7/22 0:17:23阅读更多 →
RAG 在投研报告生成中的应用:多源研报的检索与融合

RAG 在投研报告生成中的应用:多源研报的检索与融合

RAG 在投研报告生成中的应用:多源研报的检索与融合 一、一份投研报告需要参考 20 份券商研报——信息过载如何解决? 投研分析师在撰写一份行业报告时,通常需要阅读: 5-10 份券商深度研报3-5 份行业白皮书若干公司财报和公告 传统方…

2026/7/22 0:15:22阅读更多 →
Go语言静态资源打包方案对比与实践指南

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

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

2026/7/21 0:51:49阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

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

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

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

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

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

2026/7/21 0:51:49阅读更多 →
中小企业小程序开发公司怎么选:预算、上手和售后避坑指南

中小企业小程序开发公司怎么选:预算、上手和售后避坑指南

中小企业做小程序,最常见的矛盾是预算有限,但又不希望功能太单薄;没有技术团队,但又希望后续能自己运营;想快速上线,又担心隐性收费和售后失联。选型时如果只看“低价套餐”或“案例数量”,很容…

2026/7/22 0:01:17阅读更多 →
GEO优化如何沉淀长期内容资产?广拓时代谈AI搜索时代的内容ROI

GEO优化如何沉淀长期内容资产?广拓时代谈AI搜索时代的内容ROI

企业做营销,最怕钱花完了,资产没有留下。 效果广告能带来一段时间的曝光,但预算停止后,流量往往也随之停止。短视频内容可能在几天内冲高,也可能很快沉下去。AI搜索时代,企业需要重新思考一个问题&#xff…

2026/7/22 0:01:17阅读更多 →
Agent 终态判定:何时该停止思考、给出最终回复

Agent 终态判定:何时该停止思考、给出最终回复

Agent 终态判定:何时该停止思考、给出最终回复 一、你的 Agent 在"再想想"的循环里绕了 12 轮,用户已经关窗口了 Agent 与人最大的区别是:人知道什么时候该停下来给答案,Agent 会一直"想"下去。你给 Agent 接…

2026/7/22 0:01:17阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/21 22:53:50阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/21 18:53:30阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/21 18:53:30阅读更多 →