You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为什么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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 17:01:02