news 2026/4/16 11:55:07

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/14 18:43:20

MindSpore 高性能调优:图算融合 + 自定义算子的推理

在 Ascend/GPU 硬件上部署工业级视觉模型时&#xff0c;默认算子的串行开销、硬件适配不足往往会成为性能瓶颈。本次分享通过图算融合的精细化规则配置基于 TBE 的自定义高性能算子&#xff0c;将 ResNet50 的推理吞吐量提升 80%&#xff0c;同时把单样本延迟压缩至原有的 45%&…

作者头像 李华
网站建设 2026/4/11 3:52:13

分享经济视角下社会化众包与众筹的创新路径——链动2+1模式AI智能名片小程序的融合应用

摘要&#xff1a;在数字经济快速迭代的背景下&#xff0c;分享经济思维推动社会化众包与众筹模式成为企业资源整合、资金筹集及运营效率提升的核心抓手。社会化众包通过汇聚分散社会力量完成专业化任务&#xff0c;众筹则依托大众参与实现资金与资源的快速聚合&#xff0c;两者…

作者头像 李华
网站建设 2026/4/16 1:08:59

五年博士1年读完,20分钟干完48小时教授工作!这个工具在硅谷火了

芝加哥教授20分钟干完48小时工作&#xff0c;零基础小白10分钟造出完整App&#xff0c;前xAI工程师睡一觉醒来项目就做好了……Claude Code正在重新定义「编程」这件事。 一个顶级程序员&#xff0c;30天没写一行代码。 但他负责的项目&#xff0c;6个月做到了10亿美元年化营…

作者头像 李华
网站建设 2026/4/14 9:01:46

VSCode中,通过SFTP插件管理远程服务器文件

在VSCode中&#xff0c;通过SFTP插件管理远程服务器文件可以极大提升开发效率。目前有几款主流插件&#xff0c;它们的功能侧重和操作方式有所不同&#xff0c;你可以根据自己的习惯和项目需求来选择。 下面的表格对比了四款主流的SFTP相关插件&#xff1a;插件名称 (作者/发布…

作者头像 李华