const在左边→指向内容不可变,右边→指针本身不可变;常量指针(const T)内容只读、指针可重定向;指针常量(T const)指针固定、内容可修改;二者兼具(const T const)则内容与地址均不可变。

const 在 * 左边还是右边,决定“谁不可变”
关键看 const 紧挨着谁:const 在 * 左边 → 指向的内容不可变;const 在 * 右边 → 指针本身不可变。中间有没有空格不影响语义,只看相对位置。
常量指针(pointer to const):内容不能改,指针可以换地址
写法是 const T* p 或等价的 T const* p。这里的 const 修饰的是 T,即它指向的那个值是只读的。
- 允许执行
p = &b;(重新指向别的变量) - 禁止执行
*p = 42;(修改它当前指向的值) - 常见于函数参数,比如
void print(const int* p),保证函数不意外改原始数据
int a = 10, b = 20; const int* p = &a; *p = 30; // ❌ 编译错误:不能通过 p 修改 *p p = &b; // ✅ 合法:p 可以指向别处
指针常量(const pointer):指针不能换地址,内容可以改
写法是 T* const p。const 紧贴 * 右边,修饰的是指针变量自身,意味着这个指针初始化后就不能再指向别处。
- 禁止执行
p = &b;(指针值不可再赋值) - 允许执行
*p = 42;(它指向的值仍可修改) - 必须在定义时初始化,否则编译报错:
T* const p;是非法的
int a = 10, b = 20; int* const p = &a; // ✅ 必须初始化 *p = 99; // ✅ 合法:修改 a 的值 p = &b; // ❌ 编译错误:p 本身是 const
既是指针常量又是常量指针(const T* const)
写法是 const T* const p,两个 const 各管一摊:左边的管内容,右边的管指针变量。两者都不可变。
立即学习“C++免费学习笔记(深入)”;
- 不能改
*p - 不能改
p - 必须初始化
int a = 10; const int* const p = &a; *p = 5; // ❌ p = &a; // ❌ // 定义后就彻底只读 + 固定地址
最容易漏掉的是:当指针类型嵌套或带 typedef 时,const 的绑定对象容易误判。建议用「从右往左读」方式解析声明,比如 const int* const p 读作 “p 是一个 const 指针,指向一个 const int”。










