当const遇到指针,引用时,我们往往会很困惑,它修饰的是指针本身还是指针所指向的变量呢?本文会助你解决这类问题。
🔹 C++ const 修饰顺序图
1. 基础规则(右左法则)
读一个声明时:
- 从变量名开始
 - 先看右边,再看左边
 *、&优先级相同,按结合律const修饰它左边最近的东西(如果左边没有,就修饰右边)
2. 常见例子图
1  | int* p;  | 
1  | const int* p; //const左边没东西,限定右边的int  | 
1  | int* const p; //左边有int *,const限定int *  | 
1  | const int* const p;  | 
1  | int& r;  | 
1  | const int& r;  | 
3. 来个测试
问题引入:
1  | template<typename T>  | 
这个模板报了第12行代码的模板和原模版不匹配,这个原因是为什么呢?
解决思路:
1  | const std::string& t; // const 左边没东西,限定std::string  | 
1  | const int*& r; //const 限定int  | 
1  | int* const& r; //左边有int * ,const限定int*  | 
再看看这个原模板,我们希望const限定的是T类型数据t的引用内容,而我们的主角是int *,是一个指向int的指针,我们需要这个指针不被修改,而不是这个指针指向的一个int数据不被修改,所以要改成下面这种情况才能匹配原模板。
📌 C++ const 修饰速查表
| 声明 | 含义 | 哪个是 const | 能否改对象 | 能否改指针 | 
|---|---|---|---|---|
int* p; | 
p 是指针,指向 int | 无 const | ✅ 可以 | ✅ 可以 | 
const int* p; 或 int const* p; | 
p 是指针,指向 const int | int 是 const | ❌ 不行 | ✅ 可以 | 
int* const p; | 
p 是 const 指针,指向 int | 指针是 const | ✅ 可以 | ❌ 不行 | 
const int* const p; | 
p 是 const 指针,指向 const int | 两者都 const | ❌ 不行 | ❌ 不行 | 
int& r; | 
r 是 int 的引用 | 无 const | ✅ 可以 | —— | 
const int& r; | 
r 是 const int 的引用 | int 是 const | ❌ 不行 | —— | 
const int*& r; | 
r 是引用,绑定到「指向 const int 的指针」 | int 是 const | ❌ 不行 | ✅ 可以 | 
int* const& r; | 
r 是引用,绑定到「const 指针,指向 int」 | 指针是 const | ✅ 可以 | ❌ 不行 | 
const int* const& r; | 
r 是引用,绑定到「const 指针,指向 const int」 | 两者都 const | ❌ 不行 | ❌ 不行 | 
📌 口诀总结
const在*左边 → 修饰所指对象const int* p→ 指向 const int(不能改对象)
const在*右边 → 修饰指针本身int* const p→ const 指针(不能改指针)
&出现时,就是“引用到前面那一整个类型”。
- 本文作者: 迪丽惹Bug
 - 本文链接: https://lyroom.github.io/2025/10/04/常量指针还是指针常量——const到底修饰了谁?/
 - 版权声明: 本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!