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

问题描述 投票:0回答:4

我理解指向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 对我来说似乎不清楚。

c pointers
4个回答
2
投票

声明:

const int *ptr;

指定

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

表达式

ptr + n
(回想一下
x[y]
*(x + y)
相同)也有类型
const int *
,所以你不能改变that指向的任何一个。这在 C 标准 的第 6.5.6p8 节中关于加法运算符有详细说明:

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


1
投票

这在您链接到的文档中有解释:

一致性\

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

因为在

const int
之前有
*
,这意味着指向的对象由常量整数组成。索引指针不会改变这个声明;当您将指针用作数组时,声明描述了所有数组元素。


1
投票

const int *ptr
-
ptr
变量的类型是“指向
const int
的指针”。

无论您如何操纵

ptr
指向其他地方,它都带有该类型。因此,用它来改变它“背后”的东西是无效的。


0
投票

指针引用一个const对象。您是否对这个指针进行过任何指针运算都没有关系。 它总是引用一个

const
对象.

© www.soinside.com 2019 - 2024. All rights reserved.