理解指向整数常量的常量指针(const int * const * variable)

3

给出一个例子

const int limit = 500;
const int * const cpci = &limit;
const int * const * pcpci = &cpci;

我很难理解最后一行的意思。

基本上,以数组术语来看,值pcpci只是(const int * const)的数组。但是我似乎无法在pcpci内创建多个副本,因为它不应该是一个常量指针。

例如

const int limit = 500;
const int * const cpci = &limit;
const int * const * pcpci = &cpci;
const int limit2 = 600;
const int * const cpci2 = &limit2;
*(pcpci+1) = &cpci2;

在上面代码的最后一行,我收到了“error lvalue must be modifiable”的错误提示。但我想知道为什么会出现这种情况,因为pcpci不是一个常量指针,只有它的元素应该是常量且不可修改的。

这与数组无关。 - EOF
"pcpci只是一个数组" 不,指针不是数组。 - alk
2个回答

3

首先,这个声明

*(pcpci+1) = &cpci;

由于指针可能指向不是对象的位置,因此它具有未定义行为。如果pcpci指向数组的一个元素,并且pcpci+1指向同一数组的下一个元素,您可以使用这种结构。

因此,更正确的写法应该是:

*(pcpci) = &cpci;

然而,pcpci 指向的对象是一个类型为 T const 的常量对象,其中 T 是 const int *,因此它不能被重新赋值。

为了更清晰,您可以重写定义。

const int * const * pcpci = &cpci;

以下是一种方法:
typedef const int * const ConstPointerToConstObject;

ConstPointerToConstObject * pcpci = &cpci;

因此,如果要取消引用pcpci,您将得到一个类型为ConstPointerToConstObject的对象,因为它是指向常量对象的常量指针,因此无法更改。


2

但我想知道为什么会发生这种情况,因为pcpci不是一个常量指针

不过,*(pcpci+1) 是一个常量指针。它具有类型 const int* const。显然,你不能赋值给它。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接