C++中的指针常量和常量指针怎么区分?(const修饰符位置的差异)

13次阅读

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

C++中的指针常量和常量指针怎么区分?(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 pconst 紧贴 * 右边,修饰的是指针变量自身,意味着这个指针初始化后就不能再指向别处。

  • 禁止执行 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”。

text=ZqhQzanResources