Немного расширяя ответ Кристиана Гиббонса ...
В C строковые литералы, такие как "Hello World"
, хранятся в массивах char
, так что они видны в течение всего времени существования программы. . Строковые литералы предполагаются как неизменяемые, и некоторые реализации будут хранить их в сегменте памяти только для чтения (например, попытка изменить содержимое литерала вызовет ошибку времени выполнения). Некоторые реализации этого не делают, и попытка изменить содержимое литерала может не вызвать ошибку времени выполнения (может даже показаться, что она работает должным образом). Определение языка C оставляет поведение «undefined», чтобы компилятор мог обрабатывать ситуацию, как он считает нужным.
В C ++ строковые литералы хранятся в массивах <em>const</em> char
, так что любые попытка изменить содержимое литерала вызовет диагностику c во время компиляции .
Как указывает Кристиан, ключевое слово const
изначально не входило в состав C. Однако изначально он был частью C ++ и делает использование строковых литералов немного безопаснее.
Помните, что ключевое слово const
не означает «сохранить это в постоянной памяти», а означает только «эта вещь не может быть целью назначения».
Также помните, что, если это не операнд операторов sizeof
или унарных *
, или строковый литерал, используемый для инициализации массива символов в объявлении, выражение типа «N-элементный массив T
» будет преобразован («распад») в выражение типа «указатель на T
», а значением выражения будет адрес первого элемента массива.
В C ++, когда вы пишете
const char *str = "Hello, world";
, адрес первого символа строки сохраняется в str
. Вы можете установить str
так, чтобы он указывал на другой строковый литерал:
str = "Goodbye cruel world";
, но то, что вы не можете сделать, - это изменить содержимое строки, что-то вроде
str[0] = 'h';
или
strcpy( str, "Something else" );