643757107 发表于 2025-8-18 10:17

C语言关键字const使用详解

本帖最后由 643757107 于 2025-8-18 10:19 编辑

在C语言中,const关键字用于定义只读变量(常量),即被修饰的变量值不能被修改。它增强了代码的安全性和可读性,防止意外修改重要数据。以下是const关键字的详细用法和规则:核心作用定义常量声明一个值不可变的变量:const int MAX_SIZE = 100;
// MAX_SIZE = 200;// 编译错误!不能修改const变量
保护函数参数防止函数内部修改传入的参数:void print_data(const char *str) {
    // str = 'A';// 错误!不能修改const修饰的内容
    printf("%s", str);
}
修饰指针(关键难点)根据const位置不同,有3种用法:


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

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

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

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

643757107 发表于 2025-8-18 10:22

关键特性
必须初始化
const变量必须在声明时初始化:
const int x;   // 错误!未初始化
const int y = 5; // 正确与普通变量的区别

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

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

与#define的区别



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

643757107 发表于 2025-8-18 10:29

常见应用场景
定义硬件寄存器地址
const volatile uint32_t *const UART_STATUS_REG = (uint32_t*)0x4000;
// 解释:
// - 第一个const:寄存器值可能被硬件改变,但代码不能写
// - volatile:防止编译器优化
// - 第二个const:固定指向该地址保护数组/字符串
void process_data(const int arr[], int len) {
    // 函数内不能修改arr[]的内容
}

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

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

643757107 发表于 2025-8-18 10:31

重要规则

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


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

struct Point {
    const int x; // 必须通过初始化赋值
    int y;
};

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


在C++中的差异

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

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

const int size = 10;
int arr; // 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可以:

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

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

帮助编译器优化(知道某些数据不会改变)

灰色与青 发表于 2025-8-27 13:25

const 在 C 中用于定义常量,修饰变量表示其值不可修改;修饰指针可限制指针指向不可改或指针本身不可改;修饰函数参数防止修改实参;修饰函数返回值禁止返回值被修改。增强代码可读性与安全性,便于编译器优化。

lxs0026 发表于 2025-9-30 23:50

总是修饰它左边的内容;如果左边没有内容,则修饰右边的内容。
页: [1]
查看完整版本: C语言关键字const使用详解