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) неправильным?

621   6  

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

    Ничего не найдено.