我理解指向const的指针是一个指针,通过它指针指向的变量的值不能改变。因此,在下面的示例中,我希望编译器会引发错误:
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;
}
第二个例子(带有
ptr[1]++
)抛出error: increment of read-only location ‘*(ptr + 4)’
。因此看起来不仅指针指向的变量的值不能改变,而且其他相关内存位置的值也不能改变。
关于此的确切行为是什么?这种行为在哪里被引用?例如,https://en.cppreference.com/w/cpp/language/pointer 对我来说似乎不清楚。
声明:
const int *ptr;
指定
ptr
是指向 const int
的指针,因此不允许通过该指针更改它指向的内容。
表达式
ptr + n
(回想一下x[y]
与*(x + y)
相同)也有类型const int *
,所以你不能改变that指向的任何一个。这在 C 标准 的第 6.5.6p8 节中关于加法运算符有详细说明:
当整数类型的表达式与指针相加或相减时, 结果具有指针操作数的类型。 ...
这在您链接到的文档中有解释:
一致性\
- 如果cv出现在指针声明中的
之前,它是decl-specifier-seq的一部分并应用于指向的对象。*
因为在
const int
之前有*
,这意味着指向的对象由常量整数组成。索引指针不会改变这个声明;当您将指针用作数组时,声明描述了所有数组元素。
const int *ptr
- ptr
变量的类型是“指向 const int
的指针”。
无论您如何操纵
ptr
指向其他地方,它都带有该类型。因此,用它来改变它“背后”的东西是无效的。
指针引用一个const对象。您是否对这个指针进行过任何指针运算都没有关系。 它总是引用一个
const
对象.