Указатель на литерал? - PullRequest
       15

Указатель на литерал?

4 голосов
/ 30 ноября 2019

Читая C ++ Primer , я наткнулся на эту строку:
const char *cp = "Hello World";

Насколько я понимаю, "Hello World" - это строковый литерал, который представляет собой массив константперсонажи. Поскольку массив распадается на указатель на первый элемент в массиве. Означает ли это, что cp указывает на H, что является литералом? Разве невозможно иметь указатель на литерал, так как указатель должен указывать на адрес объекта в памяти?

1 Ответ

4 голосов
/ 01 декабря 2019

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

Тип хранения литерального строкового типауказано: "... Строковые литералы имеют статическую длительность хранения и, следовательно, существуют в памяти на весь срок жизни программы ..." source: https://en.cppreference.com/w/cpp/language/string_literal

Следовательно, адресбуквальная строка может быть взята и сохранена в const char *.

. Как предложено @MichaelKenzel:

Из проекта стандарта C ++ 17 (n4659) https://timsong -cpp.github.io/cppwp/n4659/lex.string#16

Оценка строкового литерала приводит к строковому литеральному объекту со статической продолжительностью хранения, инициализированному из заданных символов, как указанонад. Все ли строковые литералы различны (то есть хранятся ли в неперекрывающихся объектах) и дают ли последовательные вычисления строкового литерала один и тот же или другой объект не определено. [Примечание: эффект от попытки изменить строковый литерал не определен. - Конечная нота]

...