Разница между const char *, char const *, const char const * & string storage

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

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

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

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

Ответ 1

1 и 2 эквивалентны, и укажите тип указателя на const char. Сам указатель не const. 3 является недопустимым, поскольку он повторяет "const". Это как сказать const const int. Заказ не имеет отношения к делу, поэтому он также хотел бы сказать int const int.

В C99 допустимо повторить const. Но в С++ вы не можете повторить его.

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

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

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

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

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

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

Ответ 2

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

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

(3) const char const*

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

(4) const char * const

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

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

Ответ 3

  • const char * и char const * имеют тот же смысл: указанное значение 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;.

Ответ 4

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

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

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

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

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

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

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

Ответ 5

  • const char* означает указатель на постоянный символ
  • char const* означает точно то же самое, что и 1. (вы, вероятно, отправлялись на char* const, который является постоянным указателем на символ.)
  • const char const* недействителен, как указал Йоханнес

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

Ответ 6

  • const char * Указатель на константу char (читайте справа налево).

  • То же, что и # 1.

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

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