1. 为什么需要const限定符?
指针是C++中最强大也最容易出错的特性之一。很多初学者在接触指针时,常常因为修改了不该修改的内存区域而导致程序崩溃。const限定符就像是给指针加上了一把安全锁,告诉编译器:"这块内存你别动!"
我在实际开发中见过太多因为指针误操作引发的bug。有一次团队里有个新人写了个函数,本意只是读取配置参数,结果不小心通过指针修改了全局配置,导致整个系统行为异常。这种问题往往要花几个小时才能定位到。如果当时用了const限定符,编译器就能直接报错阻止这种错误。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. const限定符的基本用法
2.1 指向常量的指针
这种写法表示指针指向的内容不可修改:
cpp复制const int* ptr; // ptr是一个指向const int的指针
这里有个记忆技巧:const在*左边,表示指向的内容是常量。就像给保险箱上了锁,你可以看里面有什么(读取),但不能修改里面的东西。
2.2 常量指针
这种写法表示指针本身不可修改:
cpp复制int* const ptr = &var; // ptr是一个const指针,指向int
记忆方法:const在*右边,表示指针本身是常量。就像把指针用胶水固定住了,不能改变它指向谁,但可以修改指向的内容。
2.3 指向常量的常量指针
双重保护,指针和指向的内容都不可修改:
cpp复制const int* const ptr = &var;
这就像把保险箱焊死在地板上,既不能移动保险箱,也不能打开它。
3. 实际开发中的典型应用场景
3.1 函数参数保护
这是const指针最常用的场景:
cpp复制void printString(const char* str) {
// 函数内部不能修改str指向的内容
cout << str << endl;
}
我在项目中强制要求所有只读参数都必须加const。这样做有两个好处:
- 防止函数内部意外修改
- 明确传达函数的设计意图
3.2 硬件寄存器访问
在嵌入式开发中,硬件寄存器通常被声明为volatile const指针:
cpp复制volatile const uint32_t* co
