const指针指指针本身不可变,指向const的指针指所指内容不可变;前者const在右侧(如int const p),后者const在左侧(如const int p),二者可叠加为const int* const p实现双重只读。

const指针和指向const的指针是C++中容易混淆的两个概念,关键区别在于const修饰的是指针本身,还是指针所指向的内容。下面用代码直观说明:
指向const的指针(内容不可改)
语法:const int* p; 或 int const* p;
含义:指针p可以改变(能指向别处),但*p不能被修改(不能通过p改它指向的值)。
示例:
立即学习“C++免费学习笔记(深入)”;
int a = 10, b = 20; const int* p = &a; *p = 30; // ❌ 编译错误:不能通过p修改a的值 p = &b; // ✅ 合法:p现在指向b
const指针(指针本身不可改)
语法:int* const p = &a;
含义:指针p的地址值固定不变(初始化后不能再指向别的变量),但*p可以修改(能改它原来指向的那个值)。
示例:
立即学习“C++免费学习笔记(深入)”;
int a = 10, b = 20; int* const p = &a; *p = 100; // ✅ 合法:a变成100 p = &b; // ❌ 编译错误:p不能再指向b
既指向const、又是const的指针(双重不可变)
语法:const int* const p = &a;
含义:p不能换指向,*p也不能被修改——彻底只读绑定。
示例:
立即学习“C++免费学习笔记(深入)”;
int a = 10; const int* const p = &a; *p = 20; // ❌ 错误:不能改内容 p = &a; // ❌ 错误:不能改指针本身(即使指向同一变量也不行)
记忆小技巧
- 看
const的位置:紧挨着*左边 → 修饰“指向的内容”;紧挨着*右边 → 修饰“指针本身” - 从右往左读更清晰:
int const * p→ “p是一个指针,指向一个const int”;int * const p→ “p是一个const指针,指向int” - const在星号左边(如
const int*)→ 内容只读;const在星号右边(如int* const)→ 指针只读
基本上就这些。理解核心是分清“谁被const了”——是数据,还是指针变量自己。










