我知道从右到左阅读声明的经验法则,我很清楚我知道发生了什么,直到一位同事告诉我:
const MyStructure** ppMyStruct;
表示"ppMyStruct是指向(可变)MyStructure的const指针 "(在C++中).
我本以为它意味着"ppMyStruct是一个指向const MyStructure指针的指针 ".我在C++规范中寻找答案,但显然我不是很擅长......
在C++中意味着什么,它在C中意味着什么?
你的同事错了.这是指向const MyStructure的(非const)指针的(非const)指针.在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限定符的指针指针的所有替代品.从右到左的规则可以用来破译声明(至少在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("f.i = %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
你是对的.
另一个答案已经指出了" 顺时针螺旋规则 ".我非常喜欢那个 - 虽然有点精心设计.