指针操作中const修饰的正确用法

指针与const的几种组合形式

在C++开发中,指针操作是日常绕不开的内容。而加上const修饰后,很多人容易搞混到底是谁不能改——是指针本身?还是指针指向的数据?搞清楚这一点,能少踩很多坑。

常见的组合有三种:

  • const int* ptr:指向“常量”的指针,数据不能改,指针可以改
  • int* const ptr:指针本身是常量,数据能改,指针不能改
  • const int* const ptr:两者都不能改

指向常量的指针(const在前)

这种写法表示你不能通过这个指针去修改它所指向的内容。比如你在处理一个配置参数,别人传给你一个int指针,但你不该修改原始值,这时候就可以用这种形式。

const int* ptr = &value;
//*ptr = 10; // 编译错误!不能修改值
ptr = &another; // OK,可以改变指针指向

这就像你借了同事的笔记本抄电话号码,他告诉你:“可以看,可以记,但别改我本子上的内容”。

常量指针(const在指针符号后)

这时候指针一旦初始化,就不能再指向别的地址了。但你可以通过它修改目标值。适用于某些固定映射关系的场景,比如硬件寄存器地址绑定。

int value = 5;
int* const ptr = &value;
*ptr = 10; // OK,修改值
//ptr = &another; // 错误!不能改指针

这好比你把自己的笔借给了别人,说“你可以用它写字,但别拿去送人”。

指向常量的常量指针

两个都不能动。典型用于只读数据的固定访问点,比如ROM中的字符串表。

const int val1 = 100;
const int* const ptr = &val1;
// *ptr = 200; // 错误
// ptr = &val2; // 错误

这种最严格,像银行保险柜的钥匙交给你,但规定既不能换锁也不能改里面的东西。

实际开发中的好处

合理使用const能帮助编译器优化,更重要的是让接口意图更清晰。比如函数参数如果声明为const int*,调用者一眼就知道“放心传,不会被篡改”。

在团队协作中,这种显式约束减少了沟通成本。原本需要写注释提醒“别改这个值”,现在直接由语言机制保障。

很多人一开始觉得const啰嗦,但项目一大,代码一复杂,就会发现这些小小的修饰,省去了大量调试时间。