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

指向const的指针:为何ptr[1]同样具有只读属性?

关于const int*指针的修改限制问题

我原本理解const int*是无法通过指针修改指向的变量值的指针,所以下面的代码编译器报错是符合预期的:

int main()
{
    int a = 42;
    const int *ptr = &a;
    ptr[0]++;

    return 0;
}

但为什么下面这段代码同样会报错?

int main()
{
    int a = 42;
    const int *ptr = &a;
    ptr[1]++;

    return 0;
}

这段代码的错误信息是:error: increment of read-only location ‘*(ptr + 4)’,看起来不仅指针指向的变量不能修改,其他内存位置也不能通过这个指针修改。请问这个行为的确切规则是什么?依据出自哪里?


核心规则

const int*的本质是:这个指针的所有解引用操作(包括指针算术运算后的解引用)得到的都是const int类型的只读左值。不管你是访问ptr[0](等价于*ptr)还是ptr[1](等价于*(ptr+1)),只要是通过这个指针间接访问内存,得到的位置都会被视为只读。

C语言标准明确规定:当声明const T *p时,p是指向const T类型的指针。对p进行算术运算后得到的新指针,仍然保持指向const T的属性;解引用该指针得到的左值带有const限定符,属于不可修改的左值——而自增操作(++)要求操作数是可修改的左值,因此编译器会直接报错。

你之前的误解是把限制范围缩小到了指针初始指向的单个变量,但实际上const限定的是指针的访问权限:通过这个指针去访问任何内存位置,都只能读不能写,哪怕这个位置是越界的(编译器在语法检查阶段就会拦截修改操作,不会先判断内存是否合法)。

内容的提问来源于stack exchange,提问作者Ramanewbie

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 14:30:08