Ответ 1
Ваш коллега ошибается. Это (неконстантный) указатель на (неконстантный) указатель на const MyStructure. В C и С++.
Я знаю правило большого пальца, чтобы читать декларации справа налево, и я был уверен, что знаю, что происходит, пока коллега не сказал мне, что:
const MyStructure** ppMyStruct;
означает, что ppMyStruct является указателем на указатель const на (изменяемую) MyStructure "(на С++).
Я бы подумал, что это означает, что "ppMyStruct является указателем на указатель на const MyStructure". Я искал ответ в спецификации С++, но, видимо, я не очень хорош в этом...
Что означает в С++, и означает ли это то же самое в C?
Ваш коллега ошибается. Это (неконстантный) указатель на (неконстантный) указатель на const MyStructure. В C и С++.
В таких случаях инструмент cdecl (или С++ decl) может быть полезным:
[[email protected] ~]$ 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
Это все альтернативы указателя на указатель с одним определителем констант. Правило справа налево может использоваться для расшифровки объявлений (по крайней мере, на С++, я не эксперт 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 С++ 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". Это действительно относится к типу. Это бы сразу разъяснило смысл, просто прочитайте его 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
}