在 C/C++ 中,指针常量(Pointer Constant) 和 常量指针(Pointer to Constant) 是两个容易混淆的概念。它们的主要区别在于:
- 指针本身是否可变
- 指针指向的值是否可变
1. 常量指针(Pointer to Constant)
📌 指向常量的指针,不能修改指向的数据。
语法:
const int* ptr;
或者:
int const* ptr;
特点:
- ✅ 指针本身可变(可以指向不同的变量)。
- ❌ 指向的值不可变(不能修改
*ptr)。
示例
int a = 10;
int b = 20;
const int* ptr = &a; // 指向 a
ptr = &b; // ✅ 可以改变指针指向
*ptr = 30; // ❌ 错误:不能修改指针指向的值
📌 等价于:
int const* ptr = &a;
✅ 指针可以改指向,不能改指向的值!
2. 指针常量(Constant Pointer)
📌 指针本身是常量,不能修改指针的指向,但可以修改指向的值。
语法:
int* const ptr;
特点:
- ❌ 指针本身不可变(不能指向其他变量)。
- ✅ 指向的值可变(可以修改
*ptr)。
示例
int a = 10;
int b = 20;
int* const ptr = &a; // 必须初始化,否则报错
ptr = &b; // ❌ 错误:指针不能改变指向
*ptr = 30; // ✅ 正确:可以修改指针指向的值
✅ 指针不能改指向,但可以修改指向的值!
3. 常量指针常量(Constant Pointer to Constant)
📌 指针和指向的值都不能变。
语法:
const int* const ptr;
特点:
- ❌ 指针不可变(不能指向其他变量)。
- ❌ 指向的值不可变(不能修改
*ptr)。
示例
int a = 10;
int b = 20;
const int* const ptr = &a; // 必须初始化
ptr = &b; // ❌ 错误:指针不能改变指向
*ptr = 30; // ❌ 错误:指针指向的值也不能修改
✅ 最严格,指针和值都不能改!
4. 总结对比
| 类型 | 语法 | 指针本身可变? | 指向的值可变? |
|---|---|---|---|
| 常量指针 | const int* ptr; 或 int const* ptr; | ✅ 可变 | ❌ 不可变 |
| 指针常量 | int* const ptr; | ❌ 不可变 | ✅ 可变 |
| 常量指针常量 | const int* const ptr; | ❌ 不可变 | ❌ 不可变 |
5. 记忆技巧
const在*左边 → 指针指向的值不可变(常量指针)const在*右边 → 指针本身不可变(指针常量)const两边都有 → 指针和值都不可变
6. 例子:
#include <iostream>
int main() {
int a = 10, b = 20;
// 常量指针:指针可变,指向的值不可变
const int* p1 = &a;
p1 = &b; // ✅ 可以改指向
//*p1 = 30; // ❌ 错误:不能修改值
// 指针常量:指针不可变,指向的值可变
int* const p2 = &a;
//*p2 = 30; // ✅ 可以修改值
//p2 = &b; // ❌ 错误:指针不可修改
// 常量指针常量:指针和值都不可变
const int* const p3 = &a;
//p3 = &b; // ❌ 错误:指针不可修改
//*p3 = 30; // ❌ 错误:不能修改值
return 0;
}
✅ 理解 const 位置,避免指针错误! 🚀
718

被折叠的 条评论
为什么被折叠?



