Разница между const char *, char const *, const char const * и хранением строк - PullRequest
10 голосов
/ 28 июля 2011

Прежде всего, в чем разница между:

(1) const char*
(2) char const*
(3) const char const*

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

Кроме того, как строковые литералы хранятся компилятором?Это не домашняя работа, я просто проверяю C для интервью на случай, если кому-то все равно.

Ответы [ 6 ]

18 голосов
/ 28 июля 2011
(1) const char* 
(2) char const* 

Это указатель (который вы можете изменить) на символ (или несколько символов), который вы не можете изменить. Другими словами, все строковые литералы.

(3) const char const*

Это удвоено. Я думаю, что вы пытались перейти на третью позицию:

(4) const char * const

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

Строковые литералы будут (скорее всего) сосредоточены сразу после вашего кода, обычно в сегменте или разделе, называемом «родата».

7 голосов
/ 28 июля 2011

Здесь достаточно много правильных ответов, но вам может быть трудно запомнить, вот трюк, чтобы запомнить это:

1>, когда const находится в левой части *, это означает, чтоуказатель указывает на постоянный объект;

например, const int * p означает, что int нельзя изменить с помощью указателя p

2>, когда const находится справа от *, это означает, что указательконстантный указатель;

например, int * const p означает, что p является константным указателем, который нельзя изменить.

Кстати, если у вас есть const по обе стороны от *, то это означает, что это константный указатель иВы не можете изменить объект с помощью указателя.

например int const * const p

7 голосов
/ 28 июля 2011

1 и 2 эквивалентны и указывают тип указателя на const char. Сам указатель не является постоянным. 3 является недействительным, потому что он повторяет «const». Это как сказать const const int. Порядок не имеет значения, так что это все равно, что сказать int const int.

В C99 действительно повторять const вот так. Но в C ++ вы не можете повторить это.

Кроме того, как строковые литералы хранятся компилятором?

Они хранятся неопределенным образом. Но компиляторам разрешено хранить их в доступной только для чтения части программы. Таким образом, вы не можете писать в строковые литералы. Вам гарантируется, что они останутся распределенными в течение всего времени жизни программы (другими словами, они имеют статическую продолжительность хранения).

Это не домашнее задание, я просто подтасовываю С для интервью на случай, если кому-то все равно.

Вы должны знать о тонких различиях между C и C ++. В C99, как объяснено выше, const const int разрешено. В C89 и C ++ это запрещено. Однако в C ++ вы можете ввести избыточный const, если он применяется к typedef, который сам является const:

typedef int const cint;
cint const a = 0; // this const is redundant!

То же самое касается параметров шаблона.

6 голосов
/ 28 июля 2011
  • const char * и char const * имеют одинаковое значение: указанное значение является постоянным, но сам указатель можно изменить на другой адрес.После инициализации *p = 'X'; недопустимо (не компилируется), а p = &x; (где x - переменная типа char) является действительным (компилируется).

  • Итак, const char const * означает дважды одно и то же.

  • char * const: указанное значение можно изменить, но сам указатель является постоянным.Его нельзя изменить, чтобы он указывал на другой адрес.После инициализации *p = 'X'; является действительным, а p = &x; - нет.

  • const char * const и char const * const имеют одинаковое значение: и указанное значение, и указатель являются постоянными.Ни *p = 'X';, ни p = &x; не действительны после инициализации.

1 голос
/ 28 июля 2011
  1. const char * Указатель на постоянные данные char (читается справа налево).

  2. То же, что # 1.

  3. const char * const Указатель константы (указатель не может быть изменен) на постоянные данные (данные не могут быть изменены).

  4. Строковые литералы хранятся в постоянной памяти,обычно как есть, завершается символом '\ 0'.Они являются постоянными указателями на постоянные данные.

1 голос
/ 28 июля 2011
  1. const char* означает указатель на постоянный символ
  2. char const* означает в точности то же самое, что и 1. (вы, вероятно, выбрали char* const, который является постоянным указателем на символ.)
  3. const char const* недопустимо, поскольку Йоханнес уже указал

Строковые литералы обычно хранятся в сегменте данных только для чтения вашего исполняемого файла, но этосредства не гарантированы.

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