为什么C++中const int*指针的两类操作合法性存在差异
问题根源:对
const修饰指针的作用范围理解偏差 你觉得两段操作等价,是混淆了「指针的访问权限」和「指针指向内存本身的访问属性」,二者完全不是一回事。
首先明确const int *l的核心语义:这个声明只给指针l本身加上了访问约束:你不能通过l这个指针去修改它指向的内存值,但这个约束完全不会影响指向的原变量i本身的读写权限。
第一段代码合法的原因
int i=4; const int *l=&i; cout<<*l; i=6; cout<<*l;
逐行看合法性:
const int *l=&i;:合法,把普通int变量的地址赋值给指向const int的指针是允许的,相当于给可变变量i绑定了一个只读的访问入口- 两次
cout<<*l;:合法,只是通过指针l读取值,没有触发修改操作,第一次读出来是初始值4,第二次读的时候i已经被修改,所以读出来是6,最终输出46 i=6;:完全合法,i本身是定义为普通可修改的int变量,没有任何const约束,不管有没有其他指针指向它,直接通过变量名修改值都是合规的
你可以把这个逻辑类比成:你给一个可编辑的文档开了一个只读预览窗口,你不能在预览窗口里改文档内容,但你完全可以切回原文档的编辑界面改内容,改完之后预览窗口自然会同步显示最新的内容,这个过程没有任何违规。
第二段代码编译失败的原因
int i=4; const int *l=&i; *l=4;
这里的非法操作点非常明确:你试图通过带const只读约束的指针l去修改指向的内存值,直接违反了const int*类型给指针设定的「只能读不能写」的规则,编译器会在编译阶段直接拦截这个操作。
关键误区澄清
你觉得两种操作都是修改了l指向的值,本质差异在于修改的路径完全不同:
- 通过原变量名
i修改:走的是i本身的权限,i是可变int,修改完全不受其他指向它的指针的const属性影响 - 通过
const int*类型的指针l修改:走的是指针l的权限,这个指针的类型明确要求不能通过它写值,不管指向的内存本身是不是可变,只要用这个指针执行写操作就属于类型违规
补充容易混淆的const指针规则供参考:
const int *l/int const *l:指向常量的指针,不能通过指针改指向的值,指针本身可以改指向int *const l:常量指针,指针本身不能改指向,可以通过指针改指向的值const int *const l:指向常量的常量指针,既不能改指针指向,也不能通过指针改指向的值
内容的提问来源于stack exchange,提问作者Dudu Dudu
相关产品推荐
相关产品推荐

