2014-11-22 137 views
2

给出的例子了解指针常量指针到整型常量(const int的* const的*变量)

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; 

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

+0

这与数组无关。 – EOF 2014-11-22 18:30:09

+0

“* pcpci它只是一个数组*”不,指针不是数组。 – alk 2014-11-22 18:46:57

回答

2

这一切的说法

*(pcpci+1) = &cpci; 

首先是未定义的行为,因为你可能无法提领一点不指向一个对象的指针。如果pcpci指向数组的一个元素,并且pcpci + 1也指向同一数组的下一个元素,则可以使用此构造。

因此,这将是更coorectly写

*(pcpci) = &cpci; 

然而对象指向pcpciT const型恒定对象,其中T是const int *所以它可能不被重新分配。

,这将是更清楚你可以重写定义

const int * const * pcpci = &cpci; 

通过以下方式

typedef const int * const ConstPointerToConstObject; 

ConstPointerToConstObject * pcpci = &cpci; 

所以,如果要derefernce pcpci你会得到ConstPointerToConstObject类型的对象,可能不会因为改变它是一个常量指针到常量对象。

2

但我不知道为什么会这样,因为pcpci不是一个常量指针

没有,但*(pcpci+1)是。它有型号const int* const。显然你不能指定任何东西。