举个例子
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不是一个常量指针,只有它的元素应该是常量且不可修改的。
答案 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
类型的对象,该对象可能无法更改,因为它是一个常量指针到常量对象。