news 2026/2/21 10:24:59

c语言 typedef、共用体、位运算、位段、枚举类型、内存管理

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
c语言 typedef、共用体、位运算、位段、枚举类型、内存管理

C 语言核心特性详解:typedef、共用体、位运算、位段、枚举类型、内存管理

这六个主题是 C 语言中非常重要且经常一起考察的“底层细节”部分,尤其在嵌入式开发、系统编程、算法面试、驱动开发等领域,几乎是必考内容。下面按清晰的结构逐一讲解,重点突出定义、用法、典型场景、常见陷阱面试高频写法

1. typedef(类型别名)

作用:给已有的类型起一个新的名字,提高代码可读性、移植性、一致性。

最常见的几种用法

// 1. 基本类型别名(最常用)typedefunsignedintuint32_t;typedefunsignedlonglonguint64_t;// 2. 结构体别名(最经典用法)typedefstruct{intx;inty;}Point;// 以后可以直接写 Point p;// 3. 指针类型别名(非常常见,尤其函数指针)typedefint(*FuncPtr)(int,int);// FuncPtr 是一个指向函数的指针类型// 4. 数组类型别名typedefintIntArray[10];// IntArray 等价于 int[10]// 5. void* 的别名(常用于泛型编程)typedefvoid*Handle;

面试高频写法对比

// 错误 / 不推荐structPoint{intx,y;};structPointp;// 每次都要写 struct// 推荐(现代 C 项目几乎都这么写)typedefstructPoint{intx,y;}Point;Point p;// 简洁

常见陷阱
typedef只是起别名不是创建新类型,所以下面两种是完全等价的:

typedefint*IntPtr;IntPtr a,b;// a 和 b 都是 int*int*a,b;// a 是 int*,b 是 int ← 完全不同!

2. 共用体(union)

核心思想同一块内存被多个成员共用,同一时刻只能有一个成员有效。

语法

unionData{inti;// 4 字节floatf;// 4 字节charc;// 1 字节doubled;// 8 字节(union 整体大小取最大成员)};unionData d;printf("sizeof(union Data) = %zu\n",sizeof(d));// 通常输出 8

典型用途

  1. 节省内存(嵌入式最常见)
  2. 类型转换 / 内存解释(查看内存的多种解释)
  3. 实现类似 C++ 的 union 类型(C11 _Generic 之前)

经典面试题:用 union 判断大小端

intis_little_endian(){union{inta;charb;}u={0x12345678};returnu.b==0x78;// 小端:低字节在低地址}

3. 位运算(Bit Operations)

C 语言位运算符是底层编程的利器,尤其在寄存器操作、标志位、算法优化中无处不在。

运算符含义用途示例
&按位与清零特定位、取交集
|按位或置位特定位、取并集
^按位异或翻转特定位、交换两个数(不用临时变量)
~按位取反全部位翻转(注意符号位)
<<左移乘 2^n、快速置位
>>右移除 2^n(有符号右移保留符号位)

高频技巧

// 1. 判断奇偶if(n&1)// 奇数// 2. 交换两个数(不用临时变量)a^=b;b^=a;a^=b;// 3. 取一个数的第 k 位(从 0 开始)intbit=(n>>k)&1;// 4. 设置第 k 位为 1n|=(1<<k);// 5. 清零第 k 位n&=~(1<<k);// 6. 翻转第 k 位n^=(1<<k);// 7. 统计二进制 1 的个数(Brian Kernighan 算法)intcount=0;while(n){n&=(n-1);// 每次清掉最低位的 1count++;}

4. 位段(Bit-field)

作用:在结构体中用而不是字节来定义成员,极度节省内存,常用于硬件寄存器映射、协议字段定义。

语法

structFlags{unsignedintflag1:1;// 只占 1 bitunsignedintflag2:1;unsignedintmode:3;// 占 3 bit,可表示 0~7unsignedintvalue:8;// 占 8 bit// 总共 13 bit,通常被填充到 2 字节或 4 字节};structFlagsf={0};f.flag1=1;// 合法f.mode=5;// 合法// f.value = 300; // 非法!越界编译器可能警告或截断

关键规则

  • 位段只能是int、signed int、unsigned int、_Bool(C99 后支持 _Bool)
  • 位段成员不能取地址(& 操作非法)
  • 位段的存储顺序依赖编译器实现(通常跟机器字节序一致,但不保证跨平台)
  • 位段之间不能跨类型边界(除非显式指定 :0 填充)

典型应用:硬件寄存器映射

typedefstruct{uint32_tenable:1;uint32_tmode:2;uint32_treserved:13;uint32_tirq_status:8;uint32_treserved2:8;}__attribute__((packed))RegConfig;

5. 枚举类型(enum)

C 的枚举本质上是一组具名整数常量

基本写法

enumColor{RED=0,GREEN,BLUE=5,// 可以指定值YELLOW};enumColorc=RED;// 合法c=10;// 合法(C 枚举是弱类型)

C11 引入的 enum class(强类型枚举)(推荐)

enumclassStatus:int{OK=0,ERROR,TIMEOUT};Status s=Status::OK;// 必须带 Status::intx=static_cast<int>(s);// 显式转换

面试高频用法:状态机、错误码

typedefenum{STATE_IDLE,STATE_CONNECTING,STATE_CONNECTED,STATE_DISCONNECTING}StateMachine;

6. 内存管理(malloc / calloc / realloc / free)

C 语言手动内存管理是其强大但也最容易出错的地方。

函数作用是否清零常见用法场景
malloc分配 size 字节内存通用
calloc分配 num × size 字节,并清零初始化结构体、数组
realloc调整已有内存块大小(可扩可缩)动态数组扩容
free释放 malloc/calloc/realloc 分配的内存必须成对使用

经典动态二维数组写法(最常考)

int**create_matrix(introws,intcols){int**matrix=malloc(rows*sizeof(int*));if(!matrix)returnNULL;for(inti=0;i<rows;i++){matrix[i]=malloc(cols*sizeof(int));if(!matrix[i]){// 清理已分配部分for(intj=0;j<i;j++)free(matrix[j]);free(matrix);returnNULL;}// 可选:memset(matrix[i], 0, cols * sizeof(int));}returnmatrix;}voidfree_matrix(int**matrix,introws){if(!matrix)return;for(inti=0;i<rows;i++){free(matrix[i]);}free(matrix);}

内存管理高频陷阱

  1. 释放后使用(use-after-free)
  2. 重复释放(double free)
  3. 释放非动态分配的内存(free 栈上变量)
  4. 忘记释放(内存泄漏)
  5. realloc 失败后原指针失效(要用临时变量接收)

现代推荐做法(C11+)

// 安全释放宏(防止 double free)#defineSAFE_FREE(p)do{if(p){free(p);(p)=NULL;}}while(0)

以上六个知识点几乎涵盖了 C 语言“底层编程”面试的半壁江山。

想继续深入哪个部分?
A. 位运算经典算法题(位计数、只出现一次的数字等)
B. 共用体 + 位段 实现寄存器映射完整案例
C. 动态内存管理常见 bug 及 valgrind 检测方法
D. typedef + 函数指针 + 回调函数完整写法
E. 其他你想细化的点

告诉我字母,我们继续写代码和剖析!

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/2/15 0:49:02

C语言指针

C语言指针详解&#xff08;最清晰、最完整的入门到进阶指南&#xff09; 指针是 C 语言中最强大、最重要、也最容易出错的核心特性。 一句话总结&#xff1a;指针就是“地址的变量”&#xff0c;它存储的是另一个变量&#xff08;或内存块&#xff09;的内存地址&#xff0c;通…

作者头像 李华
网站建设 2026/2/15 3:38:05

springboot宠物医院预约挂号系统动物诊所vue

目录 技术架构核心功能特色设计部署方式 开发技术源码文档获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01; 技术架构 基于SpringBoot后端框架与Vue.js前端框架构建的宠物医院预约挂号系统&#xff0c;采用前后端分离设计。后端提供RESTful API接…

作者头像 李华
网站建设 2026/2/17 7:24:46

【Django毕设全套源码+文档】基于Python的高校卫生健康疫情防控信息管理系统的设计与实现(丰富项目+远程调试+讲解+定制)

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华
网站建设 2026/2/15 12:17:59

【Django毕设全套源码+文档】基于Django的电子商务网站及其安全策略设计(丰富项目+远程调试+讲解+定制)

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华
网站建设 2026/2/19 18:37:41

模型上下文协议 (MCP):AI 与外部世界的标准化连接框架

模型上下文协议 (Model Context Protocol&#xff0c;简称 MCP) 是由 「Anthropic 公司&#xff08;Claude AI 的创造者&#xff09;于 2023 年底推出的一项开放协议」。其核心目标是「为 AI 模型与外部数据源、工具和服务之间的连接建立统一、安全、高效的标准」&#xff0c;解…

作者头像 李华
网站建设 2026/2/11 18:40:54

基于深度学习YOLOv10的手语识别检测系统(YOLOv10+YOLO数据集+UI界面+Python项目源码+模型)

一、项目介绍 摘要 本项目基于YOLOv10目标检测算法开发了一套高效的手语字母识别系统&#xff0c;专门用于识别美国手语字母表中的26个字母(A-Z)。系统通过深度学习技术实现了对手势的实时检测与分类&#xff0c;为手语识别和人机交互领域提供了创新的解决方案。项目使用自定…

作者头像 李华