const位置决定修饰对象:在左修饰值,在右修饰指针本身;const int p可改指针不可改值,int const p可改值不可改地址,const int* const p二者皆不可改。

const 在 * 左边还是右边决定修饰对象
关键就看 const 相对于 * 的位置:在左,修饰指向的值;在右,修饰指针本身。这不是语感问题,是编译器解析规则——C++ 从右向左读声明,const 紧邻谁,就限定谁。
-
const int* p和int const* p完全等价:const 在 * 左侧,修饰int,即*p是只读的 -
int* const p:const 在 * 右侧,修饰p本身,即p的地址不可变 -
const int* const p:两边都有 const,p不可改,*p也不可改
常量指针(const int*)能改指针,不能改值
典型场景是函数参数,比如 void print(const char* s)——你传进去的是普通字符串变量,但函数内部不能通过 s 改它,这是接口契约。
组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。
-
*p = 100→ 编译错误:assignment of read-only location '* p' -
p = &b→ 合法,指针可以重新指向其他const int或普通int - 即使指向的是普通变量(如
int a = 5; const int* p = &a;),也不能通过p修改a,但a = 10依然合法
指针常量(int* const)必须初始化,之后不能改地址
常见于硬件寄存器映射、配置项绑定等需要“固定地址 + 可写内容”的场合,比如 volatile int* const reg = (int*)0x40000000;。
-
int* const p = &a;→ 必须初始化,否则编译报错:uninitialized const variable 'p' -
p = &b→ 错误:assignment of read-only variable 'p' -
*p = 20→ 合法,指向的内存内容可修改 - 注意:
int* const p;单独声明不赋值会直接编译失败
容易踩的坑:const 位置混淆 + 初始化遗漏
最常出错的是把 const int* p 当成“p 是 const”,结果在循环里反复赋新地址却没报错,而本意其实是想锁死地址;反过来,写 int* const p 却忘了初始化,编译器不会给你默认值。
- 写
const int* p却期望p不可变 → 实际上它完全可以重定向,要锁地址得用int* const - 写
int* const p但没在定义时赋值 → 编译失败,C++ 不允许 const 变量延迟初始化 - 混合使用时漏掉一个
const:const int* const p才是完全只读,少一个就留了可变入口
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!










