news 2026/4/8 6:03:48

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/4/6 11:28:45

《MySQL表的创建与约束:定义结构化数据的存储载体》

《MySQL表的创建与约束&#xff1a;定义结构化数据的存储载体》 MySQL 中的表&#xff08;Table&#xff09; 是关系型数据库最核心的存储单元&#xff0c;它定义了数据的结构、类型、约束和关系&#xff0c;是结构化数据的物理载体。 本篇从最基础的建表语法开始&#xff0c…

作者头像 李华
网站建设 2026/3/27 8:17:17

多功能聚合引擎!多城市智慧同城小程序源码系统

温馨提示&#xff1a;文末有资源获取方式在数字化生存的今天&#xff0c;一个成功的本地平台&#xff0c;必须是信息、服务、商业与社交的聚合体。我们向您郑重推介一款全面升级的多城市智慧同城小程序源码系统。它不仅仅是一套代码&#xff0c;更是一个完整的商业生态系统解决…

作者头像 李华
网站建设 2026/3/27 6:40:55

苹果AirTag 2来了!重点升级UWB芯片,查找范围提升50%

2026年1月26日&#xff0c;苹果公司正式发布了第二代AirTag&#xff0c;这是自2021年初代产品问世以来的首次重大更新。这款经过五年等待的新品保持了与上一代相同的外观设计和价格定位&#xff0c;但内在的定位芯片、查找范围和用户体验都得到了显著提升。01 核心升级新一代Ai…

作者头像 李华
网站建设 2026/4/5 8:53:28

教师工具箱神器,吾爱出品

今天推荐两款工具&#xff0c;一款是教师工具箱&#xff0c;一款是系统文件转移工具&#xff0c;有需要的小伙伴可以下载收藏。 第一款&#xff1a;教师工具箱 教师工具箱是一款绿色单文件版的工具&#xff0c;软件集成了老师经常用到的实用工具&#xff0c;需要哪个功能&…

作者头像 李华
网站建设 2026/4/5 13:33:10

基于深度学习YOLOv8的可回收塑料识别分类检测系统(YOLOv8+YOLO数据集+UI界面+Python项目源码+模型)

一、项目介绍 摘要 本项目基于先进的YOLOv8目标检测算法&#xff0c;开发了一套高效准确的可回收塑料识别分类检测系统。系统能够自动识别并分类7种不同类型的塑料制品&#xff0c;包括HDPE塑料、多层塑料、PET瓶、一次性塑料、单层塑料、挤压管和UHT盒。项目使用了大规模数据…

作者头像 李华