大家好,我是网域小星球。
在C语言进阶学习、笔试面试和实际工程项目中,有几个关键字出镜率极高:const、static、volatile、register。
它们分别控制变量的只读属性、生命周期、存储位置、编译优化,是写出规范、健壮、高效代码的必备知识点。
本篇一次性讲透这四个关键字,对比清晰、例子完整,VS2022 可直接运行。
一、本章学习目标
-
掌握 const:只读限制、指针与const组合、防止误修改
-
掌握 static:修饰局部变量、全局变量、函数,改变生命周期与作用域
-
理解 volatile:禁止编译器优化,应对多线程/硬件变化
-
了解 register:建议存入寄存器,提高访问速度
-
搞定面试高频组合题: const char *p 、 char *const p 等
二、const 只读关键字
作用
修饰变量,让变量变成只读,不能被修改,从语法上防止误操作。
- 修饰普通变量
c
const int a = 10;
a = 20; // 报错:不能给只读变量赋值
- 指针与const(面试必考)
- const 左边:指向的内容不能改
c
const char *p;
char const *p;
// *p 不能改,p 本身可以变
- const 右边:指针本身不能改
c
char *const p;
// p 不能变,*p 可以改
- 两边都const:都不能改
c
const char *const p;
口诀:
左定值,右定针,左右都const全都不能动。
- 函数参数用const
告诉调用者:函数内部不会修改你传进来的数据,更安全。
c
void print(const char *str) {
printf("%s", str);
}
三、static 静态关键字
static 核心作用两个:
-
改变生命周期(延长到程序结束)
-
限制作用域(只在当前文件可见)
-
修饰局部变量
-
局部变量默认在栈上,函数结束就销毁
-
static 修饰后,放到全局区,只初始化一次,值会保留
c
void func() {
static int cnt = 0;
cnt++;
printf("%d ", cnt);
}
int main() {
func(); // 1
func(); // 2
func(); // 3
}
- 修饰全局变量
-
普通全局变量:整个工程可见
-
static 全局变量:只在当前 .c 文件可见,避免命名冲突
- 修饰函数
-
普通函数:整个工程可调用
-
static 函数:只在当前文件可见,文件内部私有函数
四、volatile 易变关键字
作用
告诉编译器:
这个变量随时可能被外部改变,不要优化它,每次都从内存重新读取。
使用场景
-
硬件寄存器(嵌入式)
-
多线程共享变量
-
中断服务函数修改的变量
示例:
c
volatile int flag = 0;
while (flag == 0) {
// 若没有volatile,编译器可能优化掉死循环
}
如果没有 volatile,编译器发现代码里没改 flag,会直接优化成 while(1) ,导致程序逻辑错误。
五、register 寄存器关键字
作用
建议编译器把变量放到CPU寄存器中,而不是内存,访问极快。
特点
-
只是建议,不是命令
-
寄存器没有地址,不能用 & 取地址
-
适合频繁使用的变量(循环计数)
c
register int i;
for (i = 0; i < 100000; i++);
现代编译器已经非常智能,现代编程中很少手动使用。
六、四个关键字对比速记表
关键字 核心作用 存储位置 面试频率
const 只读,不可修改 同普通变量 ⭐⭐⭐⭐⭐
static 延长生命周期,限制作用域 全局区 ⭐⭐⭐⭐⭐
volatile 禁止编译器优化 内存 ⭐⭐⭐⭐
register 建议存入寄存器 寄存器/内存 ⭐⭐⭐
七、高频易错点
-
混淆 const char *p 和 char *const p
-
以为 static 局部变量每次都会初始化
-
误以为 static 能改变局部变量作用域(只能在函数内用)
-
对 register 变量使用 & 取地址
-
过度使用 volatile 导致程序效率下降
八、本章核心总结
-
const:保护数据不被修改,指针组合是面试重点
-
static:修饰局部/全局/函数,实现持久化与私有化
-
volatile:应对"意外变化"的变量,禁止编译优化
-
register:高频变量放入寄存器,提升速度
-
合理使用这四个关键字,能让代码更安全、高效、专业
下期预告
C语言从0入门(二十五)|位运算与位段:底层/嵌入式必备技能
下一篇我们学习二进制操作:与、或、异或、移位、位段,是底层开发、驱动、网络协议必备技能。