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

时间:2014-11-22 18:27:59

标签: c pointers const constants

举个例子

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

我很难理解最后一行的含义。

基本上在数组术语中,pcpci值只是(const int * const)' s的数组。但我似乎无法在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;

在上面代码的最后一行我得到了#34;错误左值必须是可修改的"。但我想知道为什么会发生这种情况,因为pcpci不是一个常量指针,只有它的元素应该是常量且不可修改的。

2 个答案:

答案 0 :(得分:2)

  

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

不,但*(pcpci+1)是。它的类型为const int* const。显然你不能分配任何东西。

答案 1 :(得分:2)

首先是这句话

*(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类型的对象,该对象可能无法更改,因为它是一个常量指针到常量对象。