发布时间:2026/7/21 20:51:49
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 分文件编程的优点模块化将相关功能组织在一起便于维护代码复用头文件可以被多个源文件包含编译效率修改单个文件时只需重新编译该文件团队协作不同开发者可以同时处理不同文件隐藏实现细节头文件只暴露接口保护实现细节

相关新闻

2026/7/21 20:51:49

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

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

2026/7/21 20:51:49

UE5高分辨率渲染下阴影条纹问题的成因分析与系统解决方案

1. 项目概述:高分辨率下的“条纹阴影”究竟是什么? 在UE5项目里,当你把渲染分辨率拉到4K、8K甚至更高,准备截一张惊艳的展示图或渲染一段高质量影片时,屏幕上那些本该平滑的阴影区域,却突然出现了令人抓狂的…

2026/7/22 0:17:20

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

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

2026/7/22 0:17:20

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

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

2026/7/22 0:17:20

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

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

2026/7/22 0:17:20

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

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

2026/7/20 6:33:00

Unity与Python本地通信:基于Flask的跨语言数据交换实战

1. 项目概述:为什么我们需要一个本地通信服务器?在游戏开发、数字孪生、仿真训练等众多领域,Unity作为强大的实时3D内容创作平台,其核心逻辑通常由C#驱动。然而,当我们需要进行复杂的数据分析、机器学习推理、科学计算…

2026/7/22 0:02:17

抓包代理链路下的 TLS 指纹变化分析 TLSFOWARD抓包工具

抓包代理链路下的 TLS 指纹变化分析:为什么调试环境会影响访问结果 摘要 在网页调试、接口联调、自动化巡检和授权采集排查中,抓包是常见手段。但很多开发者会遇到一个现象:正常访问页面时没有问题,一进入抓包或代理调试环境&…

2026/7/22 0:02:17

微信QQ聊天记录误删恢复与备份方案全指南

1. 聊天记录误删的常见场景与恢复思路作为一名长期关注数据安全的技术博主,我处理过上百起聊天记录误删的求助案例。手机误操作、系统升级失败、设备损坏是三大常见诱因。上周就遇到用户更新微信时断电,导致近两年的工作群聊记录全部消失的极端案例。不同…

2026/7/22 0:02:17

2026最新8款个人AI编程免费工具深度实测

作为一名全栈独立开发者,我最近半年一直在折腾副业项目,每个月在AI编程工具上的订阅费算下来其实也不算便宜。作为个人开发者,我们追求的就是用最少的成本获得最高效的开发体验。TRAE 基础版免费,字节跳动出品的国内首款 AI 原生 …

2026/7/21 20:02:44

3个高效策略:快速掌握Axure中文界面配置

3个高效策略:快速掌握Axure中文界面配置 【免费下载链接】axure-cn Chinese language file for Axure RP. Axure RP 简体中文语言包。支持 Axure 11、10、9。不定期更新。 项目地址: https://gitcode.com/gh_mirrors/ax/axure-cn 还在为Axure RP的英文界面感…