指针篇:指针与const关键字
const关键字为C++/C中的关键字,const修饰的数据类型是指常类型,常类型的变量或对象的值是不能被更新的。这个常类型可以是指针,也可以是int等变量。
const的用法常见有以下几种:
//const在*左边的情况:常量指针 const int *pt = &n; int const *pt = &n; //const在*右边的情况:指针常量 int *const pt = &n; //比较复杂的情况 const int *const pt = &n; const int const* pt = &n;
来看第一种:const int* pt
#include <iostream> using namespace std; int main(void) { int a = 10; const int* pt = &a; int b = 11; pt = &b;//可以修改指向关系 *pt = 12;//系统报错:不允许通过指针修改值 a = 14;//变量可以通过其他引用修改值 return 0; }
来看第二种:int const* pt
#include <iostream> using namespace std; int main(void) { int a = 10; int const* pt = &a; int b = 11; pt = &b;//可以修改指向关系 *pt = 12;//系统报错:不允许通过指针修改值 a = 14;//变量可以通过其他引用修改值 return 0; }
第三种:int *const pt
#include <iostream> using namespace std; int main(void) { int a = 10; int* const pt = &a; int b = 11; pt = &b;//系统报错:不可以修改指向关系 *pt = 12;//允许通过指针修改值 a = 14;//变量可以通过其他引用修改值 return 0; }
第四种:const int *const pt
#include <iostream> using namespace std; int main(void) { int a = 10; const int* const pt = &a; int b = 11; pt = &b;//系统报错:不可以修改指向关系 *pt = 12;//系统报错:不允许通过指针修改值 a = 14;//变量可以通过其他引用修改值 return 0; }
第五种:const int const* pt
#include <iostream> using namespace std; int main(void) { int a = 10; const int const* pt = &a; int b = 11; pt = &b;//可以修改指向关系 *pt = 12;//系统报错:不允许通过指针修改值 a = 14;//变量可以通过其他引用修改值 return 0; }
综上我们可以得到:
const在*号右侧 | int *const p | 指针常量:指针本身是个被const的常量 | 可以通过指针修改值,指针的指向关系不可变 |
const在*号左侧 | const int *p | 常量指针:指针的内容是被const的常量 | 不可以通过指针修改值,指针的指向关系可变 |
另外C++中规定不允许讲const类型得变量赋值给非const指针,想要打破这种限制必须强制类型转换(const_cast)。当然,如果你采用了指向指针得指针,这种情况会更复杂,维护难度也是指数级上升。比如当你使用一级或者多级间接关系时,不允许最上层的指针向进行const,这样是无效的,所以当你使用const时尽量避免多层间接关系,或者说避免指针与指针之间的const,比如以下两种情况应避免:
int n = 10; int *pt = &n; const int* pn = pt;//无效,避免多层套娃
const int **pp; int *p1; const int n = 10; *pp = &n;//有效,将const类型的变量n地址赋值给*pp,并借用**pp进行访问 pp = &p1;//无效,不允许将非const类型指针用const类型指针访问 *p1 = 11;//第二步的前提下,原*p1的值并不是10,并且当p1的地址在部分操作系统下会随机访问到计算机禁止访问的空间,此时程序崩溃!!!
补充:const声明为内部链接,因此需要注意当const在头文件中使用时,所声明的变量只存在于包含于该头文件的c文件中,即使其他c文件也包含了同一个头文件,其内部的const变量和当前的C文件const变量内存地址不一致。
本文来自博客园,作者:{张一默},转载请注明原文链接:https://www.cnblogs.com/YiMo9929/p/16586149.html
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 【.NET】调用本地 Deepseek 模型
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库