很多C++初学者,甚至一些有经验的开发者,在const关键字与指针共舞时,常常会感到困惑。
const int *p、int * const p、const int * const p,这几个看起来像是“大家来找茬”的声明,实则蕴含着C++对类型安全和程序严谨性的深刻设计。今天,就让我们彻底终结这份困惑!
一、温故知新:const修饰普通变量
这个大家最熟悉,const修饰一个普通变量,意味着这个变量的值一旦初始化后,就不能再被修改。我们称之为“常量”。
const int a = 100;
// a = 200; // 错误!编译不通过,因为a是常量,其值不可修改
这很简单,是吧?接下来,难度升级!
二、核心进阶:const与指针的三种组合
这是本文的重点。为了方便理解,我们记住一个简单的规则:const靠近谁,谁就不能被修改。
1. 常量指针 (const int p)
声明: const int *p; 或者 int const *p; (两者等价)
解读口诀: const 在 * 的左边,修饰的是*p,也就是指针指向的内容。
这意味着:
-
可以 修改指针的指向 (p可以指向其他地址)
-
不可以 通过p来修改指针指向的内容
代码示例:
#include <iostream>
int main() {
int a = 10;
int b = 20;
const int *p = &a; // p是一个常量指针
// 尝试修改指针指向的内容 -> 失败
// *p = 15; // 错误!*p是const,不能被赋值
std::cout << "通过p访问a的值: " << *p << std::endl;
// 尝试修改指针的指向 -> 成功
p = &b;
std::cout << "p指向b后,通过p访问b的值: " << *p << std::endl;
return 0;
}
总结: 常量指针,又叫“指向常量的指针”。它像是一个游客,可以随意看不同的景点(指向不同的地址),但不能在景点上乱涂乱画(不能修改指向的内容)。
2. 指针常量 (int * const p)
声明: int * const p;
解读口诀: const 在 * 的右边,修饰的是p本身,也就是指针的指向。
这意味着:
-
不可以 修改指针的指向 (p必须在定义时初始化,且之后不能再指向其他地址)
-
可以 通过p来修改指针指向的内容
代码示例:
#include <iostream>
int main() {
int a = 10;
int b = 20;
int * const p = &a; // p是一个指针常量,必须在定义时初始化
// 尝试修改指针的指向 -> 失败
// p = &b; // 错误!p是const指针,其指向不能被修改
std::cout << "p指向a的值: " << *p << std::endl;
// 尝试修改指针指向的内容 -> 成功
*p = 15;
std::cout << "通过p修改后,a的值变为: " << a << std::endl;
return 0;
}
总结: 指针常量,它自己的指向是“从一而终”的。它像是一把绑定到某个房子的钥匙,不能用来开别的房门(不能改变指向),但可以把这间房里的东西随便改(可以修改指向的内容)。
3. 指向常量的指针常量 (const int * const p)
声明: const int * const p;
解读口诀: * 的左右两边都有const,天罗地网,啥都不能改。
这意味着:
-
不可以 修改指针的指向
-
不可以 修改指针指向的内容
代码示例:
#include <iostream>
int main() {
int a = 10;
int b = 20;
const int * const p = &a; // 必须在定义时初始化
// 尝试修改指针的指向 -> 失败
// p = &b; // 错误!
// 尝试修改指针指向的内容 -> 失败
// *p = 15; // 错误!
std::cout << "p指向a的值: " << *p << std::endl;
return 0;
}
总结: 这是一个“双重锁定”的指针,指向和内容都被const锁死了,完全不能修改。
三、总结
| 声明 | 类型 | 指向可改? | 内容可改? |
| const int *p | 常量指针 | 可以 ✅ | 不行 ❌ |
| int * const p | 指针常量 | 不行 ❌ | 可以 ✅ |
| const int * const p | 指向常量的指针常量 | 不行 ❌ | 不行 ❌ |
记住那个简单的口诀:const靠近谁,谁就被锁定。希望通过这篇文章,你能够彻底征服const与指针这对“欢喜冤家”,在C++的世界里走得更远!🚀
彻底搞懂const与指针的区别
2万+

被折叠的 条评论
为什么被折叠?



