const T 表示指向常量的指针,数据不可改、指针可改;T const 表示常量指针,指针不可改、数据可改;const T* const 两者均不可改。

在C++中,const T* 和 T* const 看起来相似,但含义完全不同。它们的区别在于“const修饰的是指针本身,还是指针所指向的数据”。
const T*:指向常量的指针(Pointer to const)
这种写法表示指针指向的数据是常量,不能通过该指针修改数据,但指针本身可以改变,即可以指向其他地址。
等价写法:const T* 和 T const * 是一样的。
特点:
立即学习“C++免费学习笔记(深入)”;
- 不能修改指针指向的内容
- 可以修改指针本身(让它指向别的地方)
示例:
const int value1 = 10;const int value2 = 20;
const int* ptr = &value1; // 指向 value1
// *ptr = 15; // 错误!不能修改指向的内容
ptr = &value2; // 正确!可以改变指针指向
T* const:常量指针(Const pointer)
这种写法表示指针本身是常量,一旦初始化后就不能再指向其他地址,但可以通过该指针修改它所指向的数据(前提是数据本身不是const)。
特点:
立即学习“C++免费学习笔记(深入)”;
- 指针初始化后不能改变指向
- 可以修改指针指向的内容(如果原数据允许)
示例:
int value1 = 10;int value2 = 20;
int* const ptr = &value1; // 初始化时指定指向
*ptr = 15; // 正确!可以修改值
// ptr = &value2; // 错误!不能改变指针指向
const T* const:指向常量的常量指针
结合上面两种情况,这种写法表示指针本身是常量,且指向的数据也是常量。
特点:
立即学习“C++免费学习笔记(深入)”;
- 不能修改指针指向
- 不能通过指针修改数据
示例:
const int value1 = 10;const int value2 = 20;
const int* const ptr = &value1;
// *ptr = 15; // 错误!不能改数据
// ptr = &value2; // 错误!不能改指针
如何快速判断const修饰的是谁?
一个简单的方法是“从右往左读”声明:
- const T* → 指针指向一个 const T(数据不能改)
- T* const → 一个 const 指针,指向 T(指针不能改)
- const T* const → const 指针指向 const T(都不能改)
关键是看 const 紧邻的是 * 还是 T。
基本上就这些。理解清楚 const 的位置,就能准确掌握指针和数据的可变性。这在函数参数、类成员函数和接口设计中非常实用。











