Давайте станем педантичными здесь.
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";
позволяет компилятору напрямую обращаться к тексту без создания переменной массиваи копирование текста в переменную.
В функции, которая получает указатель на символ, вы не можете гарантировать, что указатель указывает на правильное местоположение (содержимое указателя может быть недействительным).
Каждая декларация имеет свои преимущества и побочные эффекты.
Выбор за вами.