<p>是,完全等价;const int p 与 int const p 都表示指向常量整数的指针,指针可改地址但不可改所指值,const 修饰的是 int 而非指针本身。</p>

const int* p 和 int const* p 是一回事吗?
是,完全等价。const int* 和 int const* 都表示“指向常量 int 的指针”,即指针可以改,但不能通过它修改所指对象。编译器不区分这两种写法,const 修饰的是它左边的类型(若左边无类型,则修饰右边),所以 const int* 中 const 修饰 int,不是 *。
容易踩的坑:误以为 const 修饰指针本身——那其实是 int* const p,后者才表示“常量指针”(地址不可变)。
-
const int* p = &x;→ 可以执行p = &y;,但不能执行*p = 10; -
int* const p = &x;→ 可以执行*p = 10;,但不能执行p = &y; -
const int* const p = &x;→ 地址和值都不能改
为什么传参时常用 const int*?
函数参数用 const int* 是为了明确表达“只读访问”,既避免意外修改实参,又让调用方放心传入局部变量、字面量地址或常量数组首地址。
典型场景:遍历数组、查找最大值、字符串处理(如 strlen 内部对 const char* 的使用)。
立即学习“C++免费学习笔记(深入)”;
组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。
- 接受
const int*的函数能接收int*(隐式转换允许),但反过来不行 - 如果函数内部不需要修改数据,不加
const会导致编译器无法阻止误写,也降低接口可读性 - 注意:不能把
const int*直接赋给int*,会触发编译错误(防止绕过 const 约束)
指向 const 的指针能指向非 const 对象吗?
能,而且很常见。比如:const int* p = &x; 中 x 是普通 int 变量,p 只是承诺“我不会改它”,不改变 x 本身的可变性。
这带来一个关键行为:同一个对象,可能同时被 const 和 non-const 指针指向,修改仍生效。
-
int x = 5; const int* p = &x; int* q = &x;合法 -
*q = 10;改变x,之后*p读到的就是 10 - 但
*p = 20;编译失败 —— 约束在指针层面,不是对象层面
vector 合法吗?
不合法,编译报错:error: cv-qualifiers on array elements are not allowed(C++ 标准禁止容器元素带顶层 cv-qualifier)。const int* 是合法类型,但 std::vector<const int></const> 被视为试图存储“常量指针”,而 vector 要求元素可赋值、可移动,const 修饰顶层导致赋值操作符被禁用。
正确写法是去掉顶层 const:std::vector<const int></const> ❌,应写为 std::vector<int></int> 并在使用时用 const int* 接收;或者用 std::vector<:unique_ptr int>></:unique_ptr> 等间接方式。
真正需要“不可变指针集合”时,更现实的做法是用 std::vector<int></int> + 函数参数签名约束,而非强行塞 const 到容器模板参数里。

















