const修饰指针时分三种:const T 指针可变数据不可变,T const 指针不可变数据可变,const T* const 指针和数据都不可变,从右向左读声明可助理解。

在C++中,const关键字与指针结合使用时,容易让人混淆。关键在于理解const修饰的是什么:是指针本身?还是指针所指向的数据?下面通过三种常见形式详细解析:const T*、T* const 和 const T* const。
const T* — 指向常量的指针(指针可变,数据不可变)
这种写法表示指针指向的数据是常量,不能通过该指针修改值,但指针本身可以改变指向。
说明:const T* 等价于 T const *,const 修饰的是 * 操作的结果,也就是指向的内容。示例:
-
const int* ptr = &a;:ptr 可以指向其他变量,但不能通过 ptr 修改 a 的值。 -
*ptr = 10;❌ 错误:不能修改指向的值。 -
ptr = &b;✅ 正确:可以更改指针的指向。
T* const — 常量指针(指针不可变,数据可变)
这种写法表示指针本身是一个常量,即初始化后不能再指向别的地址,但可以通过它修改所指向的数据。
说明:const 修饰的是指针变量本身,指针的值(地址)不能变。示例:
-
int* const ptr = &a;:ptr 必须初始化,之后不能再指向其他变量。 -
*ptr = 10;✅ 正确:可以修改 a 的值。 -
ptr = &b;❌ 错误:不能改变 ptr 的指向。
const T* const — 指向常量的常量指针(指针和数据都不可变)
这是前两种情况的组合:指针本身不能变,指向的数据也不能通过该指针修改。
立即学习“C++免费学习笔记(深入)”;
说明: 两个限制同时存在,既不能改地址,也不能改值。示例:
const int* const ptr = &a;-
*ptr = 10;❌ 错误:不能修改数据。 -
ptr = &b;❌ 错误:不能修改指针。
基本上就这些。记住一个简单方法:从右往左读声明。比如 const T* const ptr 就是 “ptr 是一个 const 指针,指向一个 const T”。理解了这一点,指针和 const 的组合就不再难懂。不复杂但容易忽略细节。











