指向 const 的指针:为什么 ptr[1] 也是只读的?

Ram*_*bie 0 c pointers

我理解,指向const的指针是一个指针,通过该指针无法更改该指针所指向的变量的值。因此,在下面的示例中,我希望编译器会引发错误:

\n
int main()\n{\n    int a = 42;\n    const int *ptr = &a;\n    ptr[0]++;\n\n    return 0;\n}\n
Run Code Online (Sandbox Code Playgroud)\n

现在,为什么下面的示例也会出现错误?

\n
int main()\n{\n    int a = 42;\n    const int *ptr = &a;\n    ptr[1]++;\n\n    return 0;\n}\n
Run Code Online (Sandbox Code Playgroud)\n

第二个示例(使用ptr[1]++)抛出error: increment of read-only location \xe2\x80\x98*(ptr + 4)\xe2\x80\x99。因此,看起来不仅指针指向的变量的值不能改变,其他相关内存位置的值也不能改变。

\n

与此相关的具体行为是什么?此行为在哪里引用?例如,https://en.cppreference.com/w/c/language/pointer对我来说似乎并不清楚。

\n

dbu*_*ush 6

声明:

const int *ptr;
Run Code Online (Sandbox Code Playgroud)

指定它ptr是指向 a 的指针const int,因此不允许您通过该指针更改它指向的内容。

表达式ptr + n(回想一下x[y]与 相同*(x + y))也具有 type const int *,因此您无法更改指向的内容。C 标准第 6.5.6p8 节中有关加性运算符的内容对此进行了详细说明:

当具有整数类型的表达式与指针相加或相减时,结果具有指针操作数的类型。...


Bar*_*mar 5

您链接到的文档对此进行了解释:

常量\

  • 如果cv出现*在指针声明之前,则它是decl-specifier-seq的一部分并适用于指向的对象。

由于您有const intbefore *,这意味着指向的对象由不可通过此指针修改的整数组成。对指针进行索引不会更改此声明;当您将指针用作数组时,声明描述了所有数组元素。