const在*左边为常量指针(值不可改、指针可换),右边为指针常量(指针不可改、值可改);两者可叠加,读法建议从右向左解析。

直接看 const 相对于 * 的位置:在 * 左边是常量指针(指向常量的指针),在 * 右边是指针常量(指针本身是常量)。
const 在 * 左边:常量指针,值不可改,指针可换地址
比如 const int* p 或等价写法 int const* p。这里的 const 修饰的是 int,即“指向的值是常量”。
常见错误现象:
-
*p = 5;编译报错:assignment of read-only location '*p' - 误以为指向的变量本身必须是
const——其实不用,int a = 10; const int* p = &a;合法,且a = 20;仍可直接修改
使用场景:
立即学习“C++免费学习笔记(深入)”;
- 函数参数传入只读数据,防止函数内误改(如
void print(const char* s)) - 指向字符串字面量(
const char* msg = "hello";),避免尝试修改只读内存段
性能/兼容性影响:无运行时开销,纯编译期约束;C 和 C++ 语义一致。
组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。
const 在 * 右边:指针常量,地址不可改,值可改
比如 int* const p = &a;。这里的 const 紧贴 * 右侧,修饰的是指针变量本身。
关键限制:
- 声明时必须初始化,否则编译失败(
int* const p;报错) -
p = &b;是非法的,编译器提示:assignment of read-only variable 'p' -
*p = 42;完全合法,可以修改它所指向的变量的值
典型用途:
- 封装某个固定硬件寄存器地址(
volatile int* const REG = (int*)0x40000000;) - 绑定某个局部对象,确保后续所有操作都作用于同一目标,避免误重定向
两个 const:既不能改指针,也不能改值
写成 const int* const p = &a;,相当于上面两种限制叠加。
容易踩的坑:
- 误写成
const int const* p——语法错误,const不能连续修饰同一类型 - 和
typedef混用时混淆修饰目标,例如typedef int* IntPtr; const IntPtr p;实际等价于int* const p;(const修饰的是IntPtr类型整体),不是const int* - 在模板或 auto 推导中,
auto p = &a;推出的是int*,加const需显式写成const auto* p = &a;才得到常量指针
最易忽略的一点:const 位置决定语义,但读法上建议从右往左解析——int const* p 是“p 是一个指向 const int 的指针”,int* const p 是“p 是一个 const 指针,指向 int”。实际编码时,别依赖记忆口诀,直接盯住 * 看左右。

















