目录
-
- [1. 修饰普通变量](#1. 修饰普通变量)
- [2. 修饰指针](#2. 修饰指针)
-
- [(1) 指向常量的指针](#(1) 指向常量的指针)
- [(2) 常量指针](#(2) 常量指针)
- [(3) 指向常量的常量指针](#(3) 指向常量的常量指针)
- [3. 函数参数中的const](#3. 函数参数中的const)
- [4. 函数返回值中的const](#4. 函数返回值中的const)
- 5.注意事项
- 6.与#define的区别
在C语言中,const关键字用于定义只读变量或指针,增强代码的安全性和可读性。以下是const的详细用法及注意事项:
1. 修饰普通变量
作用:变量值不可修改,必须在定义时初始化。
示例:
c
const int a = 10; // 正确:声明时初始化
// a = 20; // 错误:a是只读的
const float pi; // 错误:未初始化
2. 修饰指针
const与指针结合时,需注意const的位置:
(1) 指向常量的指针
记忆 :看 const左边的
格式 :const T *p 或 T const *p
特点 : 修饰 T(数据类型) , 剩下 *p 指针,所以const修饰常量内容。指针指向的内容不可修改,但指针本身可指向其他地址。
c
int a = 10, b = 20;
const int *p = &a;
// *p = 30; // 错误:不能修改指向的内容
p = &b; // 正确:指针本身可改变
(2) 常量指针
格式 :T * const p
特点 :修饰 * , const修饰指针符号 ,所以 指针p 不能变。指针本身不可修改(必须初始化),但指向的内容可修改。
c
int a = 10;
int *const p = &a;
*p = 20; // 正确:修改指向的值
// p = &b; // 错误:指针不可改变
(3) 指向常量的常量指针
格式 :const T *const p
特点:指针和指向的内容均不可修改。
c
const int *const p = &a;
// *p = 20; // 错误:内容不可修改
// p = &b; // 错误:指针不可修改
3. 函数参数中的const
作用:防止函数内部意外修改参数指向的数据。
示例:
c
void print(const char *str) {
// str[0] = 'A'; // 错误:不能修改只读数据
printf("%s\n", str);
}
4. 函数返回值中的const
作用:返回的指针指向的数据不可被修改。
示例:
c
const char *getMessage() {
return "Hello World"; // 字符串字面量是常量
}
int main() {
const char *msg = getMessage();
// msg[0] = 'h'; // 错误:不可修改
}
5.注意事项
1)初始化要求:
const变量必须在定义时初始化,否则编译错误。
c
const int x; // 错误:未初始化
2)通过指针强制修改const变量:
虽然语法允许用指针绕过const限制,但这是未定义行为(可能导致程序崩溃):
c
const int a = 10;
int *p = (int*)&a;
*p = 20; // 未定义行为!
3)const变量不是常量表达式:
在C89中,const变量不能用于数组长度等需要常量表达式的场景:
c
const int size = 10;
int arr[size]; // C89中错误,C99支持变长数组(VLA)
6.与#define的区别
- const变量有类型和地址,占用内存;
- #define是预处理替换,无类型检查。
总结
用法示例 含义
const int a | 变量a不可修改 |
---|---|
const int *p/int const *p | p指向的内容不可修改 |
int *const p | 指针p不可指向其他地址 |
const int *const p | 指针p和其内容均不可修改 |
合理使用const能提高代码健壮性,明确程序中数据的读写权限,减少错误。