在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 }