[学习资料] C语言关键字const使用详解

[复制链接]
643757107 发表于 2025-8-18 10:17 | 显示全部楼层 |阅读模式
本帖最后由 643757107 于 2025-8-18 10:19 编辑

在C语言中,const关键字用于定义只读变量(常量),即被修饰的变量值不能被修改。它增强了代码的安全性和可读性,防止意外修改重要数据。以下是const关键字的详细用法和规则:

核心作用

定义常量

声明一个值不可变的变量:

  1. const int MAX_SIZE = 100;
  2. // MAX_SIZE = 200;  // 编译错误!不能修改const变量

保护函数参数

防止函数内部修改传入的参数:

  1. void print_data(const char *str) {
  2.     // str[0] = 'A';  // 错误!不能修改const修饰的内容
  3.     printf("%s", str);
  4. }

修饰指针(关键难点)

根据const位置不同,有3种用法:



类型
示例
特点
指向常量的指针const int *p 或 int const *p指针指向的值不可变,但指针本身可指向其他地址
常量指针int *const p指针本身不可变(固定指向一个地址),但指向的值可变
指向常量的常量指针const int *const p指针和指向的值都不可变
  1. int a = 10, b = 20;

  2. // 1. 指向常量的指针
  3. const int *p1 = &a;
  4. // *p1 = 30;   // 错误!不能修改值
  5. p1 = &b;       // 正确:可改变指向

  6. // 2. 常量指针
  7. int *const p2 = &a;
  8. *p2 = 30;      // 正确:可修改值
  9. // p2 = &b;    // 错误!不能改变指向

  10. // 3. 指向常量的常量指针
  11. const int *const p3 = &a;
  12. // *p3 = 40;   // 错误!
  13. // p3 = &b;    // 错误!

 楼主| 643757107 发表于 2025-8-18 10:22 | 显示全部楼层
关键特性
必须初始化
const变量必须在声明时初始化:
  1. const int x;     // 错误!未初始化
  2. const int y = 5; // 正确
与普通变量的区别

普通变量:int a = 10;(值可修改)

const变量:本质是只读变量,有内存地址(不同于#define宏)

与#define的区别


特性
const
#define
类型检查✔️ (有类型)✖️ (无类型,文本替换)
作用域块作用域无作用域(预处理后全局生效)
调试可见✔️✖️
内存占用占用内存不占用内存(编译时替换)

 楼主| 643757107 发表于 2025-8-18 10:29 | 显示全部楼层
常见应用场景
定义硬件寄存器地址
  1. const volatile uint32_t *const UART_STATUS_REG = (uint32_t*)0x4000;
  2. // 解释:
  3. // - 第一个const:寄存器值可能被硬件改变,但代码不能写
  4. // - volatile:防止编译器优化
  5. // - 第二个const:固定指向该地址
保护数组/字符串
  1. void process_data(const int arr[], int len) {
  2.     // 函数内不能修改arr[]的内容
  3. }

  4. const char *error_msg = "Fatal Error";
  5. // error_msg[0] = 'f'; // 错误!字符串字面量本身不可修改
配合extern共享常量
  1. // file1.c
  2. extern const int GLOBAL_CONST; // 声明

  3. // file2.c
  4. const int GLOBAL_CONST = 100;  // 定义


 楼主| 643757107 发表于 2025-8-18 10:31 | 显示全部楼层
重要规则

类型转换风险
强制去掉const可能导致未定义行为:


  1. const int n = 5;
  2. int *p = (int*)&n; // 强制转换(危险!)
  3. *p = 10;           // 未定义行为(可能崩溃或静默错误)

  1. struct Point {
  2.     const int x; // 必须通过初始化赋值
  3.     int y;
  4. };

  5. struct Point p1 = {10, 20}; // 正确初始化
  6. // p1.x = 30;               // 错误!x是const



在C++中的差异

C++中const变量默认是内部链接(C中需显式加extern才能外部链接)

C++允许用const变量定义数组长度,C语言不允许:

  1. const int size = 10;
  2. int arr[size]; // C中错误!C++允许


 楼主| 643757107 发表于 2025-8-18 10:34 | 显示全部楼层

场景
用法示例
作用
定义常量const int MAX = 100;创建不可修改的值
保护函数参数void f(const T *p);防止意外修改输入数据
指向常量的指针const int *p;通过指针禁止修改目标值
常量指针int *const p;固定指针的指向地址
硬件寄存器映射const volatile T *reg;安全访问硬件寄存器

 楼主| 643757107 发表于 2025-8-18 10:34 | 显示全部楼层
合理使用const可以:

提高代码可读性(明确标识不可修改的数据)

增强安全性(编译器防止误修改)

帮助编译器优化(知道某些数据不会改变)
您需要登录后才可以回帖 登录 | 注册

本版积分规则

222

主题

3931

帖子

11

粉丝
快速回复 在线客服 返回列表 返回顶部