Если это помогает на всех (и про bably нет), следующие синонимы, используя преимущества языка, которые позволяют открывать тип, который имеет вид const
, появляются сразу слева или справа от типа, но перед любыми дополнительными квалификаторами (например, указателями или ссылками):
const int * p; // does NOT require initialization
int const * q; // same as above
Оба объявить указатели на постоянные данные int
и являются взаимозаменяемыми в синтаксисе.
В то время как это:
int * const p = &a; // requires initialization.
объявляет константный указатель на int
данных; не указатель на постоянный int
данные.
Расширение этого дальше (на самом деле слияние их обоих), мы получим:
const int * const p = &a;
int const * const p = &a;
Это синонимы. Оба объявляют постоянный указатель на постоянные данные int. Ни указатель, ни то, что он указывает, - являются модифицируемыми, и оба требуют инициализации.
Бесстыдно сорван Диаграмма
Следующая беззастенчиво сорваны из .. сам (хорошо, что не очень стыдно), из слегка связанных question. Я надеюсь, что это помогает в дальнейшем объяснить различия в том, что происходит, когда вы позиционируете const
и *
в разных местах декларации:
Single-Косвенность:
char *p; // p is mutable, *p is mutable
const char *p; // p is mutable, *p is const
char const *p; // same as above.
char *const p; // p is const, *p is mutable, must be initialized.
char const *const p; // p is const, *p is const, must be initialized.
Двойной косвенному:
char **p; // ptr-to-ptr-to-char
// p, *p, and **p are ALL mutable
const char **p; // ptr-to-ptr-to-const-char
// p and *p are mutable, **p is const
char const **p; // same as above
char *const *p; // ptr-to-const-ptr-to-char
// p is mutable, *p is const, **p is mutable.
char **const p; // const-ptr-to-ptr-to-char
// p is const, *p is mutable, **p is mutable.
// must be initialized.
const char **const p; // const-ptr-to-ptr-to-const-char
// p is const, *p is mutable, **p is const.
// must be initialized.
char const **const p; // same as above
char const *const *p; // ptr-to-const-ptr-to-const-char
// p is mutable, *p is const, **p is const.
const char *const *p; // same as above.
char *const *const p; // const-ptr-to-const-ptr-to-char
// p is const, *p is const, **p is mutable.
// must be initialized.
И мой личный фаворит:
char const *const *const p; // const-ptr-to-const-ptr-to-const-char
// everything is const.
// must be initialized.
const char *const *const p; // same as above
http://c-faq.com/decl/spiral.anderson.html – chris
Лично мне не нравится * спиральный подход к типу чтения, я бы порекомендовал вам поместить 'const' в * right * (правильный) место, которое соответствует * right * (в отличие от * left *) типа 'const', в коде выше:' int const * 'и' int * const'. Затем читайте справа налево. –
@chris: Спиральное правило НЕПРАВИЛЬНО. Слушайте Дэвида Родригеса – kotlomoy