Nik*_*las 42 c c++ pointers const
我知道从右到左阅读声明的经验法则,我很清楚我知道发生了什么,直到一位同事告诉我:
const MyStructure** ppMyStruct;
Run Code Online (Sandbox Code Playgroud)
表示"ppMyStruct是指向(可变)MyStructure的const指针 "(在C++中).
我本以为它意味着"ppMyStruct是一个指向const MyStructure指针的指针 ".我在C++规范中寻找答案,但显然我不是很擅长......
在C++中意味着什么,它在C中意味着什么?
Jam*_*kin 64
你的同事错了.这是指向const MyStructure的(非const)指针的(非const)指针.在C和C++中.
flo*_*olo 60
在这种情况下,工具cdecl(或c ++ decl)可能会有所帮助:
[flolo@titan ~]$ cdecl explain "const struct s** ppMyStruct"
declare ppMyStruct as pointer to pointer to const struct s
Run Code Online (Sandbox Code Playgroud)
efo*_*nis 20
你的解释是正确的.这是另一种看待它的方式:
const MyStructure * *ppMyStruct; // ptr --> ptr --> const MyStructure
MyStructure *const *ppMyStruct; // ptr --> const ptr --> MyStructure
MyStructure * *const ppMyStruct; // const ptr --> ptr --> MyStructure
Run Code Online (Sandbox Code Playgroud)
这些是带有一个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
}
Run Code Online (Sandbox Code Playgroud)
Visual C++ 2008为最后两行提供以下错误:
error C2166: l-value specifies const object
error C2166: l-value specifies const object
Run Code Online (Sandbox Code Playgroud)
GCC 4说:
error: assignment of read-only location '**pp'
error: assignment of read-only location '*p'
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
20278 次 |
最近记录: |