const char* и char const* - это одно и то же?
насколько я понимаю, const модификаторы должны быть прочитаны справа налево. Из этого я получаю следующее:
const char*
- это указатель, элементы char которого не могут быть изменены, но сам указатель может, и
char const*
постоянный указатель на mutable chars.
но я получаю следующие ошибки в следующем коде:
const char* x = new char[20];
x = new char[30]; //this works, as expected
x[0] = 'a'; //gives an error as expected
char const* y = new char[20];
y = new char[20]; //this works, although the pointer should be const (right?)
y[0] = 'a'; //this doesn't although I expect it to work
так... который из них? Является ли мое понимание или мой компилятор(VS 2005) неправильным?
6 ответов:
на самом деле, согласно стандарту,
constизменяет элемент непосредственно на левый. Использованиеconstв начале декларации-это просто удобное сокращение. Таким образом, следующие два утверждения эквивалентны:char const * pointerToConstantContent1; const char * pointerToConstantContent2;чтобы убедиться, что сам указатель не изменяется,
constдолжно быть помещено после звездочки:char * const constantPointerToMutableContent;для защиты указателя и содержимого, на которое он указывает, используйте два константы.
char const * const constantPointerToConstantContent;Я лично приняла всегда помещая константу после части, которую я не намерен изменять, чтобы поддерживать согласованность, даже если указатель является частью, которую я хочу сохранить постоянной.
это работает, потому что оба одинаковые. Может быть, вы путаетесь в этом,
const char* // both are same char const*и
char* const // unmutable pointer to "char"и
const char* const // unmutable pointer to "const char"[чтобы запомнить это, вот простое правило,'* ' влияет на весь его LHS первый]
это потому, что правило такое:
правила:
constсвязывает слева, если нет ничего слева, то он связывает справа :)Итак, посмотрите на них как:
(const --->> char)* (char <<--- const)*как же! о, и
--->>и<<---не являются операторами, они просто показывают, чтоconstсвязывает.
(от 2 простой вопрос инициализации переменной)
действительно хорошее эмпирическое правило относительно
const:читать объявления справа налево.
(см. Vandevoorde / Josutiss "C++ Templates: The Complete Guide")
например:
int const x; // x is a constant int const int x; // x is an int which is const // easy. the rule becomes really useful in the following: int const * const p; // p is const-pointer to const-int int const &p; // p is a reference to const-int int * const * p; // p is a pointer to const-pointer to int.(: sisab retcarahc-rep a no ton ,sisab некот-рэп не tfel-от-thgir в наем я hguohT :прилив
вот как я всегда пытаюсь интерпретировать:
char *p|_____ start from the asterisk. The above declaration is read as: "content of `p` is a `char`".
char * const p|_____ again start from the asterisk. "content of constant (since we have the `const` modifier in the front) `p` is a `char`".
char const *p|_____ again start from the asterisk. "content of `p` is a constant `char`".надеюсь, что это помогает!
в обоих случаях вы указываете на постоянный символ.
const char * x //(1) a variable pointer to a constant char char const * x //(2) a variable pointer to a constant char char * const x //(3) a constant pointer to a variable char char const * const x //(4) a constant pointer to a constant char char const * const * x //(5) a variable pointer to a constant pointer to a constant char char const * const * const x //(6) can you guess this one?по умолчанию
constприменяется к тому, что находится непосредственно слева, но он может применяться к тому, что находится непосредственно справа, если ему ничего не предшествует, как в (1).
Comments