C语言中const关键字的作用和最佳使用场景是什么?
const 关键字作用:
-
常量变量
cconst int MAX_SIZE = 100; // MAX_SIZE 的值不能被修改 // MAX_SIZE = 200; // 编译错误 -
指针与 const
c// 指向常量的指针(内容不可修改) const int *ptr1 = &value; // *ptr1 = 10; // 编译错误 ptr1 = &other; // 合法 // 常量指针(地址不可修改) int *const ptr2 = &value; *ptr2 = 10; // 合法 // ptr2 = &other; // 编译错误 // 指向常量的常量指针 const int *const ptr3 = &value; // *ptr3 = 10; // 编译错误 // ptr3 = &other; // 编译错误 -
函数参数
c// 防止函数修改参数 void print_string(const char *str) { printf("%s\n", str); // str[0] = 'X'; // 编译错误 } // 返回常量指针 const char* get_version() { return "1.0.0"; } -
结构体成员
cstruct Point { const int x; const int y; }; struct Point p = {10, 20}; // p.x = 30; // 编译错误
最佳使用场景:
-
函数参数保护
c// 不修改输入数据 size_t string_length(const char *str) { size_t len = 0; while (str[len] != '\0') len++; return len; } // 不修改数组内容 int array_sum(const int *arr, size_t size) { int sum = 0; for (size_t i = 0; i < size; i++) { sum += arr[i]; } return sum; } -
全局常量
c// 头文件中定义 extern const int CONFIG_MAX_CONNECTIONS; extern const char* CONFIG_LOG_FILE; // 源文件中实现 const int CONFIG_MAX_CONNECTIONS = 100; const char* CONFIG_LOG_FILE = "app.log"; -
枚举替代
c// 使用 const 替代宏定义 const int ERROR_NONE = 0; const int ERROR_INVALID_PARAM = -1; const int ERROR_OUT_OF_MEMORY = -2; -
类常量(C++风格)
cstruct Config { const int timeout; const int max_retries; }; struct Config config = { .timeout = 30, .max_retries = 3 };
const 与 #define 对比:
-
类型安全
c// const - 有类型检查 const int BUFFER_SIZE = 1024; // #define - 无类型检查 #define BUFFER_SIZE 1024 -
调试支持
c// const - 调试器可以查看 const int value = 100; // #define - 调试器无法查看 #define value 100 -
作用域控制
c// const - 遵循作用域规则 void function() { const int local = 10; } // #define - 全局有效 #define local 10
注意事项:
-
const 初始化
c// 必须初始化 const int value; // 错误 const int value = 10; // 正确 -
const 与指针
c// 区分 const 的位置 const int *p1; // *p1 是 const int const *p2; // *p2 是 const(同上) int *const p3; // p3 是 const const int *const p4; // 都是 const -
const 与数组
c// 数组元素不可修改 const int arr[] = {1, 2, 3}; // arr[0] = 10; // 编译错误 -
const 与函数返回值
c// 返回 const 指针防止修改 const char* get_string() { return "Hello"; } // 调用者不能修改返回的字符串 const char* str = get_string(); // str[0] = 'X'; // 编译错误