1. const
— 常量修饰符
作用
- 修饰变量或指针指向内容为只读,防止修改。
- 提高代码安全性和可读性。
用法示例
const int a = 10;
void func(const char *str);
const char* getMessage(void);
特点
- 可以修饰变量、指针指向的数据、函数参数、返回值。
- 不能修饰函数本身。
2. volatile
— 易变修饰符
作用
- 表示变量可能被外部异步修改(硬件、中断、其他线程等)。
- 编译器禁止对其做优化,确保每次访问都从内存读取。
用法示例
volatile int flag;
void func(volatile int *p);
特点
- 修饰变量、指针指向的数据、函数参数。
- 不能修饰函数本身。
- 不提供同步,仅保证访问不被优化。
3. restrict
— 指针限定符(C99)
作用
- 表示指针是访问其所指向内存的唯一指针。
- 允许编译器进行激进优化,提升性能。
用法示例
void copy(int * restrict dst, int * restrict src, int n);
特点
- 只能修饰指针变量。
- 程序员必须保证指针指向的内存不与其他指针重叠。
- 错误使用可能导致未定义行为。
4. static
— 存储类修饰符
作用
- 修饰变量:局部变量静态存储,生命周期贯穿程序,作用域限于定义位置。
- 修饰变量:全局变量限制文件内可见,防止外部访问。
- 修饰函数:限制函数只在当前文件可见,实现模块封装。
用法示例
void counter() {static int count = 0;count++;printf("%d\n", count);
}
static int module_var = 100;
static void helper() {
}
特点
5. 综合示例
static int internal_counter = 0;static void incrementCounter(void) {internal_counter++;
}
void processData(const volatile int * restrict data, int size) {for (int i = 0; i < size; i++) {int val = data[i];}
}
6. 总结对比
关键字 | 修饰对象 | 作用和意义 | 是否可修饰函数本身 |
---|
const | 变量、指针指向内容 | 数据只读,防止修改,提高安全和可读性 | 否 |
volatile | 变量、指针指向内容 | 防止优化,保证每次访问内存,适合异步变化的数据 | 否 |
restrict | 指针 | 指针唯一访问所指内存,允许激进优化 | 否 |
static | 变量、函数 | 变量延长生命周期或限制可见性,函数限制文件作用域 | 是 |