const在指针声明中的位置决定语义:const在*左则指向内容不可改,const在*右则指针本身不可改,两者兼具即为常量指针。

const 在指针声明里放哪,直接决定谁不可改
C++ 里 const 和指针搭配,不是“加了就安全”,而是“位置一变,语义全变”。关键看 const 紧挨着谁:左边是“指向的内容不可改”,右边是“指针本身不可改”。
-
int const* p或const int* p:指针可改(p++合法),但 *p 不可改(*p = 5报错) -
int* const p = &x:指针初始化后不能指向别处(p = &y报错),但 *p 可改(*p = 10合法) -
int const* const p = &x:两者都不可改,真正意义上的“常量指针”
写错顺序会导致编译失败或行为不符合预期
新手常把 const int* p 误写成 int* const p,结果发现改不了值却意外锁死了指针地址,或者反过来——想锁定地址却只锁住了值。这类错误不会报语法错,但运行时逻辑崩得悄无声息。
- 函数参数传
const int* p是常见做法,保证不修改入参指向的数据 - 类成员中用
int* const ptr表示“这个指针必须绑定到构造时的对象,之后绝不重定向” - 如果用
auto推导,auto p = &x得到的是int*,不带const;要保留 const 语义得写const auto* p = &x
const 指针和 constexpr 指针不是一回事
constexpr 要求指针值(即地址)在编译期可知,且所指对象也必须是字面量或静态生命周期。而 const 指针只是运行期不可赋值,地址可以来自 new 或局部变量地址(只要生命周期撑得住)。
-
constexpr int* p = nullptr合法,但constexpr int* p = &x(x 是局部变量)非法 -
const int* p = &x(x 是局部变量)合法,只要p不活过x的作用域 - 数组首地址常被误认为可
constexpr,实际需配合static或全局变量才能满足要求
用 typedef / using 简化复杂声明时容易漏掉 const 位置
比如定义 using IntPtr = int*,然后写 const IntPtr p,你以为是 const int* p,其实等价于 int* const p——因为 const 修饰的是整个 IntPtr 类型,也就是指针本身。
立即学习“C++免费学习笔记(深入)”;
- 正确写法是
using ConstIntPtr = const int*或using IntPtrToConst = const int* - C++11 起推荐用
using而非typedef,语义更直白,尤其涉及模板时 - 用
decltype推导时也要小心:decltype(*p)是int&或const int&,不是int*
事情说清了就结束。真正难的不是记住三类写法,而是每次声明时下意识问一句:“我要锁住的是内容,还是地址,还是两者?”——多数 bug 都出在没问这一句。










