c++++中const与指针结合时,关键在于const的位置:const在左边修饰数据,表示“常量指针”(如const int ptr),指针可变但不能修改所指向的值;const在右边修饰指针本身,表示“指针常量”(如int const ptr),指针不可变但可修改所指向的值;若两边都有const(如const int* const ptr),则指针和数据均不可变,必须在声明时初始化,适用于需要严格保护的场景,理解时可依据“左定值,右定向”口诀快速判断。

在C++中,
const关键字与指针结合使用时,容易让人混淆。常见的说法“const指针”和“指针const”其实并不准确,更规范的说法是“常量指针对”和“指针常量”,它们的含义完全不同,取决于
const修饰的是指针本身,还是指针所指向的数据。
下面我们来详细解释:
一、常量指针(Pointer to const)——“指向常量的指针”
定义:指针可以指向不同的地址,但不能通过该指针修改所指向的数据。
语法形式:
const int* ptr; // 或 int const* ptr;
这两种写法是等价的,都表示“指向常量整数的指针”。
特点:
- 指向的数据是“常量”,不能通过
ptr
去修改。 - 指针本身可以改变,即可以指向其他地址。
示例:
int a = 10; int b = 20; const int* ptr = &a; // *ptr = 30; // 错误!不能通过ptr修改a的值 ptr = &b; // 正确!ptr可以指向b
关键点:
const
在*
的左边,说明数据是常量。- 口诀:“左定值,右定向”——
const
在*
左边,值不能改。
二、指针常量(const pointer)——“常量指针(注意命名歧义)”
定义:指针本身是一个常量,即指针的指向不能改变,但可以修改它所指向的数据。
语法形式:
int* const ptr = &some_variable;
特点:
- 指针一旦初始化,就不能再指向别的地址。
- 可以通过指针修改它所指向的值。
示例:
int a = 10; int b = 20; int* const ptr = &a; *ptr = 30; // 正确!可以修改a的值 // ptr = &b; // 错误!ptr不能改变指向
关键点:
const
在*
的右边,说明指针本身是常量。- 必须在声明时初始化,因为之后不能再赋值。
三、指向常量的常量指针(const pointer to const)
定义:指针本身不能改变,指向的数据也不能通过该指针修改。
语法形式:
const int* const ptr = &a;
特点:
- 指针不能重新指向其他变量。
- 也不能通过指针修改所指向的值。
示例:
int a = 10; int b = 20; const int* const ptr = &a; // *ptr = 30; // 错误!不能修改值 // ptr = &b; // 错误!不能修改指针指向
适用场景:用于保护数据和指针本身,常用于函数参数中防止误操作。
四、如何快速判断?——看const的位置
记住这个简单规则:
const
在*
左边:数据是常量 → 不能改值。const
在*
右边:指针是常量 → 不能改指向。- 两边都有
const
:都不能改。
例子分析:
| 声明 | 含义 |
|---|---|
| @@######@@ | 数据是常量,指针可变(常量指针) |
| @@######@@ | 同上(等价写法) |
| @@######@@ | 指针是常量,数据可变(指针常量) |
| @@######@@ | 数据和指针都是常量 |
五、常见误区与注意事项
-
“常量指针” vs “指针常量”命名容易混淆:
- “常量指针”指的是指向常量的指针(
const int* ptr
),重点在“指向常量”。 - “指针常量”指的是指针本身是常量(
int const* ptr
),重点在“指针是常量”。
- “常量指针”指的是指向常量的指针(
-
初始化要求:
- 指针常量(
int* const ptr
)必须在定义时初始化,否则编译报错。
- 指针常量(
-
函数参数中的使用:
const int* const ptr
基本上就这些。理解的关键是分清
const int*修饰的是
int* const后面的类型(数据),还是
int* const ptr本身(指针变量)。多写几个例子,结合“左定值,右定向”的口诀,很快就能掌握。
void func(const int* ptr); // 防止函数内修改数据 void func(int* const ptr); // 指针不能变,但数据可改(较少用) void func(const int* const ptr); // 最严格保护
const
*
*










