我理解,指向const的指针是一个指针,通过该指针无法更改该指针所指向的变量的值。因此,在下面的示例中,我希望编译器会引发错误:
\nint main()\n{\n int a = 42;\n const int *ptr = &a;\n ptr[0]++;\n\n return 0;\n}\nRun Code Online (Sandbox Code Playgroud)\n现在,为什么下面的示例也会出现错误?
\nint main()\n{\n int a = 42;\n const int *ptr = &a;\n ptr[1]++;\n\n return 0;\n}\nRun Code Online (Sandbox Code Playgroud)\n第二个示例(使用ptr[1]++)抛出error: increment of read-only location \xe2\x80\x98*(ptr + 4)\xe2\x80\x99。因此,看起来不仅指针指向的变量的值不能改变,其他相关内存位置的值也不能改变。
与此相关的具体行为是什么?此行为在哪里引用?例如,https://en.cppreference.com/w/c/language/pointer对我来说似乎并不清楚。
\n声明:
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 节中有关加性运算符的内容对此进行了详细说明:
当具有整数类型的表达式与指针相加或相减时,结果具有指针操作数的类型。...
您链接到的文档对此进行了解释:
常量\
- 如果cv出现
*在指针声明之前,则它是decl-specifier-seq的一部分并适用于指向的对象。
由于您有const intbefore *,这意味着指向的对象由不可通过此指针修改的整数组成。对指针进行索引不会更改此声明;当您将指针用作数组时,声明描述了所有数组元素。