const char * и char const * - они одинаковые? - PullRequest
79 голосов
/ 11 ноября 2011

Насколько я понимаю, const модификаторы должны читаться справа налево. Из этого я получаю, что:

const char*

- указатель, чьи элементы не могут быть изменены, но сам указатель может, и

char const*

- это постоянный указатель на mutable символов.

Но я получаю следующие ошибки для следующего кода:

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 ]

127 голосов
/ 11 ноября 2011

На самом деле, согласно стандарту, const изменяет элемент непосредственно на его левый . Использование const в начале объявления - это просто удобный умственный ярлык. Таким образом, следующие два утверждения эквивалентны:

char const * pointerToConstantContent1;
const char * pointerToConstantContent2;

Чтобы убедиться, что сам указатель не изменен, после звездочки следует ставить const:

char * const constantPointerToMutableContent;

Чтобы защитить как указатель, так и содержимое, на которое он указывает, используйте две константы.

char const * const constantPointerToConstantContent;

Я лично принял всегда , помещая const после части, которую я намерен не изменять, так, чтобы поддерживать согласованность, даже когда указатель является частью, которую я хочу сохранить постоянной.

29 голосов
/ 11 ноября 2011

Это работает, потому что оба одинаковы.Может быть, вы запутались в этом,

const char*  // both are same
char const*

и

char* const  // unmutable pointer to "char"

и

const char* const  // unmutable pointer to "const char"

[Чтобы запомнить это, вот простое правило «*» сначала влияет на всю LHS ]

24 голосов
/ 11 ноября 2011

Это потому, что правило таково:

ПРАВИЛО: const связывает влево, если слева ничего нет, тогда оно связывает вправо:)

так что смотрите на них как:

(const --->> char)*
(char <<--- const)*

и то же самое!о, а --->> и <<--- НЕ являются операторами, они просто показывают, с чем связывается const.

11 голосов
/ 22 июня 2012

(из 2 простой вопрос инициализации переменной )

Действительно хорошее эмпирическое правило в отношении const:

Чтение объявлений справа налево.

(см. Vandevoorde / Josutiss "Шаблоны C ++: Полное руководство")

Например:

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 nekot-rep a no tfel-o-thgir naem I hguohT: tidE

5 голосов
/ 18 ноября 2011

Вот как я всегда пытаюсь интерпретировать:

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`".

Надеюсь, это поможет!

0 голосов
/ 30 октября 2017

В обоих случаях вы указываете на постоянный символ.

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).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...