在C和C ++中,const指针指针是什么意思?

我知道经验法则是从右至左阅读声明,而且我确信自己知道发生了什么,直到一位同事告诉我:

const MyStructure** ppMyStruct; 

意思是“ppMyStruct是指向一个(可变的)MyStructure的常量指针的指针 ”(在C ++中)。

我会认为这意味着“ppMyStruct是一个指向常量MyStructure的指针 ”。 我在C ++规范中寻找答案,但显然我不是很擅长这个…

在C ++中意味着什么,在C中意味着什么?

你的同事是错的。 这是一个(非常量)指向常量MyStructure的(非常量)指针。 在C和C ++中。

在这种情况下,工具cdecl(或c ++ decl)可以是有帮助的:

  [flolo@titan ~]$ cdecl explain "const struct s** ppMyStruct" declare ppMyStruct as pointer to pointer to const struct s 

你的解释是对的。 这是另一种看待它的方法:

 const MyStructure * *ppMyStruct; // ptr --> ptr --> const MyStructure MyStructure *const *ppMyStruct; // ptr --> const ptr --> MyStructure MyStructure * *const ppMyStruct; // const ptr --> ptr --> MyStructure 

这些都是带有一个const限定符的指针指针的所有选项。 从右到左的规则可以用来破译声明(至less在C ++中,我不是C专家)。

说得对。

另一个答案已经指出“ 顺时针螺旋规则 ”。 虽然我非常喜欢那个,但是有一点细致。

你的同事是错的,C和C ++也是一样的。 尝试以下操作:

 typedef struct foo_t { int i; } foo_t; int main() { foo_t f = {123}; const foo_t *p = &f; const foo_t **pp = &p; printf("fi = %d\n", (*pp)->i); (*pp)->i = 888; // error p->i = 999; // error } 

Visual C ++ 2008为最后两行提供了以下错误:

 error C2166: l-value specifies const object error C2166: l-value specifies const object 

GCC 4说:

 error: assignment of read-only location '**pp' error: assignment of read-only location '*p' 

G ++ 4说:

 error: assignment of data-member 'foo_t::i' in read-only structure error: assignment of data-member 'foo_t::i' in read-only structure 

作为其他评论的推论,不要把'const'放在第一位。 它确实属于types之后。 这将立即澄清意义,只是像往常一样阅读RTL:

 MyStructure const** ppMyStruct; 
 void Foo( int * ptr, int const * ptrToConst, int * const constPtr, int const * const constPtrToConst ) { *ptr = 0; // OK: modifies the pointee ptr = 0; // OK: modifies the pointer *ptrToConst = 0; // Error! Cannot modify the pointee ptrToConst = 0; // OK: modifies the pointer *constPtr = 0; // OK: modifies the pointee constPtr = 0; // Error! Cannot modify the pointer *constPtrToConst = 0; // Error! Cannot modify the pointee constPtrToConst = 0; // Error! Cannot modify the pointer }