В чем разница между char * const и const char *? - PullRequest
250 голосов
/ 21 мая 2009

Какая разница между:

char * const 

и

const char *

Ответы [ 18 ]

323 голосов
/ 21 мая 2009

Разница в том, что const char * - это указатель на const char, а char * const - это постоянный указатель на char.

Во-первых, указанное значение не может быть изменено, но указатель может быть. Во-вторых, значение, на которое указывает указатель, может измениться, но указатель не может (аналогично ссылке).

Существует также

const char * const

, который является постоянным указателем на постоянный символ (поэтому ничего нельзя изменить).

Примечание:

Следующие две формы эквивалентны:

const char *

и

char const *

Точная причина этого описана в стандарте C ++, но важно помнить и избегать путаницы. Я знаю несколько стандартов кодирования, которые предпочитают:

char const

над

const char

(с указателем или без него), чтобы расположение элемента const было таким же, как с указателем const.

91 голосов
/ 21 мая 2009

Чтобы избежать путаницы, всегда добавьте квалификатор const.

int       *      mutable_pointer_to_mutable_int;
int const *      mutable_pointer_to_constant_int;
int       *const constant_pointer_to_mutable_int;
int const *const constant_pointer_to_constant_int;
40 голосов
/ 21 мая 2009

const всегда изменяет то, что стоит перед ним (слева от него), ЗА ИСКЛЮЧЕНИЕМ, когда это первое в объявлении типа, где оно изменяет то, что следует за ним (справа от него).

Итак, эти два одинаковы:

int const *i1;
const int *i2;

они определяют указатели на const int. Вы можете изменить где i1 и i2 очков, но вы не можете изменить значение, на которое они указывают.

Это:

int *const i3 = (int*) 0x12345678;

определяет указатель const на целое число и инициализирует его, чтобы он указывал на ячейку памяти 12345678. Вы можете изменить значение int по адресу 12345678, но вы не можете изменить адрес, на который указывает i3.

21 голосов
/ 21 мая 2009

const * char является недействительным кодом C и не имеет смысла. Возможно, вы хотели спросить разницу между const char * и char const *, или, возможно, разницу между const char * и char * const?

Смотри также:

14 голосов
/ 21 мая 2009

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

8 голосов
/ 08 июля 2016

Правило большого пальца: прочитайте определение справа налево!


const int *foo;

Означает "foo баллов (*) к int, который не может измениться (const)".
Для программиста это означает: «Я не буду менять значение того, на что foo указывает».

  • *foo = 123; или foo[0] = 123; будет недействительным.
  • foo = &bar; разрешено.

int *const foo;

Означает "foo не может измениться (const) и точки (*) на int".
Для программиста это означает: «Я не буду менять адрес памяти , к которому относится foo».

  • *foo = 123; или foo[0] = 123; разрешено.
  • foo = &bar; будет недействительным.

const int *const foo;

Означает "foo не может измениться (const) и указывает (*) на int, который не может измениться (const)".
Для программиста это означает: «Я не буду изменять значение того, на что указывает foo, и я не буду изменять адрес , на который foo ссылается».

  • *foo = 123; или foo[0] = 123; будет недействительным.
  • foo = &bar; будет недействительным.
8 голосов
/ 04 июля 2012
  1. const char * x Здесь X - это в основном символьный указатель, который указывает на постоянное значение

  2. char * const x относится к указателю символа, который является постоянным, но местоположение, на которое он указывает, может быть изменено.

  3. const char * const x является комбинацией 1 и 2, означает, что это постоянный символьный указатель, указывающий на постоянное значение.

  4. const * char x вызовет ошибку компилятора. не может быть объявлено.

  5. char const * x равно точке 1.

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

3 голосов
/ 25 января 2013

Другое правило большого пальца - проверить, где const равно :

  1. до * => значение сохраняется константа
  2. после * => указатель сам по себе константа
3 голосов
/ 21 мая 2009

Первый - синтаксическая ошибка. Может быть, вы имели в виду разницу между

const char * mychar

и

char * const mychar

В этом случае первый является указателем на данные, которые не могут быть изменены, а второй - указателем, который всегда будет указывать на один и тот же адрес.

2 голосов
/ 14 апреля 2017

Множество ответов предоставляют конкретные приемы, практическое правило и т. Д., Чтобы понять этот конкретный случай объявления переменной. Но есть универсальный способ понять любое объявление:

Правило по часовой стрелке / спираль

A)

const char *a;

Согласно правилу по часовой стрелке / спирали a - указатель на символ, который является постоянным. Это означает, что символ является постоянным, но указатель может измениться. то есть a = "other string"; в порядке, но a[2] = 'c'; не сможет скомпилировать

В) * * тысяча двадцать-одна

char * const a;

Согласно правилу, a является постоянным указателем на символ. то есть вы можете сделать a[2] = 'c';, но вы не можете сделать a = "other string";

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