【C++基础】指针常量 | 常量指针 | int* p | const int* p | int* const p| const int* const p
const
修饰指针时常常让人感到困惑:const
到底修饰的是指针,还是指针所指的值?
一、先了解什么是指针
在 C++ 中,指针是一个变量,它的值是另一个变量的地址:
int a = 10;
int* p = &a;
这表示:p
是一个指向 int
类型的指针,它保存了 a
的地址。
二、指针与 const 的四种组合
1. int* p;
普通指针:既可以修改指向的地址,也可以通过它修改值。
int a = 10;
int b = 20;
int* p = &a;
*p = 100; // 修改 a 的值
p = &b; // 修改指向
2. const int* p;
指向常量的指针:不能通过指针修改值,但可以修改指向。
✅ 指针可以变
❌ 值不可以改
int a = 10;
const int* p = &a;
// *p = 100; // ❌ 错误:不能修改 a 的值
p = nullptr; // ✅ OK:可以修改指向
3. int* const p;
常量指针:指针一旦初始化后不能改指向,但可以修改值。
❌ 指针不能变
✅ 值可以改
int a = 10;
int* const p = &a;
*p = 100; // ✅ OK:可以修改 a 的值
// p = &b; // ❌ 错误:不能修改指向
4. const int* const p;
指向常量的常量指针:既不能修改指向,也不能通过它修改值。
❌ 指针不能变
❌ 值不能改
int a = 10;
const int* const p = &a;
// *p = 100; // ❌ 错误:不能修改值
// p = &b; // ❌ 错误:不能修改指向
三、如何判断 const 修饰的是谁?
const 在
*
左边:修的是值;const 在*
右边:修的是指针本身。
声明 | 含义 |
---|---|
const int* p | 值不能变,指针能变 |
int* const p | 值能变,指针不能变 |
const int* const p | 值和指针都不能变 |
四、真实应用场景举例
函数参数保护数据:
void printData(const int* data)
{// 不允许修改 data 指向的内容,安全性高
}
函数内部固定资源:
void useBuffer()
{static int buffer[10];int* const ptr = buffer; // 不允许 ptr 改变指向,防止意外错误
}
修饰形式 | 能否修改值 | 能否修改指向 | 常见用途 |
---|---|---|---|
int* p | ✅ | ✅ | 普通指针 |
const int* p | ❌ | ✅ | 只读访问 |
int* const p | ✅ | ❌ | 固定地址,值可变 |
const int* const p | ❌ | ❌ | 完全保护,不可变 |