Разница между const char [] и const char * - PullRequest
0 голосов
/ 25 мая 2018

Итак В этой статье обсуждается использование объявления строкового литерала, например const char* foo = "foo", он заканчивается утверждением:

const char *foo = "foo";
почти никогда не то, чтоты хочешь.Вместо этого вы хотите использовать одну из следующих форм:

  • Для строки, предназначенной для экспорта:
    const char foo[] = "foo";
  • Для строки, предназначенной дляиспользуется в одном исходном файле:
    static const char foo[] = "foo";
  • Для строки, предназначенной для использования в нескольких исходных файлах для одной и той же библиотеки:
    __attribute__((visibility("hidden"))) const char foo[] = "foo";

Насколько я понимаю, const char* const foo = "foo" эквивалентно const char foo[] = "foo" просто потому, что мы говорим о указателе C-строки, который никогда не может быть изменен, чтобы указывать на что-либо еще, тогда как const char* foo = "foo" можно использоватьуказать на любую другую C-String.

Это точный синопсис?Всегда используйте const char* const или const char[]?

Ответы [ 2 ]

0 голосов
/ 26 мая 2018

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

Кроме того, для случая фиксированного массива память выделяется специально для foo.Таким образом, вам разрешено изменять содержимое массива, как обычно, и массив уничтожается, освобождая память, когда он выходит из области видимости (типичная локальная переменная).

Когда вы определяете его как указатель,Компилятор помещает foo в постоянную память и затем указывает на нее (обычно).Обратите внимание, что именно поэтому в большинстве случаев константные строки определяются как char *, и даже компилятор будет предупреждать вас, если вы установите его как неконстантный указатель.

#include <iostream>
int main()
{
    char* a = "foo";
    return 0;
} 

Этот код выдаст вам предупреждение вроде:

ISO C ++ запрещает преобразовывать строковую константу в 'char *' [-Wwrite-strings] char * a = "foo";

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

0 голосов
/ 26 мая 2018

Давайте станем педантичными здесь.

char const * const p_foo = "foo";

Выше определено {constant} указатель на {constant} символьный литерал "foo".Указатель находится на одном первом символе символьного литерала.

const char bar[] = "bar";
  • Выше определено массив символов.
  • Массив символов * read-only ".
  • Массив символов представляет собой длину текстового литерала" bar "плюс нулевой терминатор (4 символа).
  • Содержимое текстового литерала копируется в массив.(Компилятор может оптимизировать этот шаг).

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

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

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

Использование
При объявлении массива длина текста известна во время компиляции.

При объявлении указателя вам нужно будет использовать strlen для определения длины текста во время выполнения.Код времени выполнения не знает длину строки данных target ;может быть гарантирована только длина 1.

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

static const char moo[] = "moo";

позволяет компилятору напрямую обращаться к тексту без создания переменной массиваи копирование текста в переменную.

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

Каждая декларация имеет свои преимущества и побочные эффекты.
Выбор за вами.

...