在C语言中,const关键字用于定义不可修改的变量(即常量),其核心用法包括基础常量定义、指针修饰、函数形参限制及类型转换规则。以下是详细解析:
1. 基础常量定义2. const与指针的结合const修饰指针时,位置不同效果各异:
- 指向的数据不可变:const int *p1; // 或 int const *p2int num = 10;p1 = # // 合法*p1 = 20; // 错误:不能修改指向的数据
- 指针本身不可变:int *const p3 = #p3 = &another_num; // 错误:不能修改指针指向*p3 = 30; // 合法:可修改数据
- 指针和数据均不可变:const int *const p4 = #p4 = &another_num; // 错误*p4 = 40; // 错误
- 记忆技巧:const离变量名近则修饰指针,离远则修饰数据。
3. 函数形参中的const- 防止意外修改:确保函数内不修改指针指向的数据。
- 标准库示例:size_t strlen(const char *str); // 保证字符串不被修改int strcmp(const char *str1, const char *str2);
- 自定义函数示例:size_t count_char(const char *str, char ch) { size_t count = 0; while (*str) { if (*str == ch) count++; str++; // 合法:指针本身可修改 } return count;}
4. const与非const的类型转换- 安全转换:允许将非const数据赋给const指针(权限降级)。char *str1 = "hello";const char *str2 = str1; // 合法
- 危险转换:禁止将const数据赋给非const指针(可能绕过保护)。const char *str3 = "world";char *str4 = str3; // 警告或错误
- 函数传参:传递非const实参给const形参是安全的,反之则危险。
5. const vs #define总结- 何时用const:需要类型安全、调试支持或修饰指针/形参时。
- 何时用#define:需要无类型宏或条件编译时。
- 最佳实践:优先使用const定义常量,指针修饰时明确const位置,函数形参中保护数据完整性。
通过合理使用const,可提升代码健壮性和可维护性,避免意外修改关键数据。