Это может быть простой вопрос, но почему const char * не нужен адрес памяти для указания?
Пример:
const char* a = "Anthony";
и не:
const char *a = // Address to const char
как и любые другие типы делают?
c++
c
implicit-conversion
c-strings
string-literals
Weidelix
источник
источник
Ответы:
Вы можете представить эту декларацию
следующим образом
То есть компилятор создает массив символов со статической продолжительностью хранения, в котором хранится строка,
"Anthony"
и указателю присваивается адрес первого символа массива (из-за неявного преобразования указателей массива в указатели на их первые символы)a
.Вот демонстрационная программа, которая показывает, что строковые литералы являются символьными массивами.
Выход программы
Размер строкового литерала (массива, в котором хранится строковый литерал) равен тому,
8
что строка также содержит символ завершающего нуля '\0'
.В демонстрационной программе выражение
может быть заменено только выражение
источник
Оно делает.
C-строка буквального типа
распадается по адресу 1- го символа. Как, кстати; любой массив в C делает.
источник
const char[8]
(в C ++, может бытьchar [8]
в C, не уверен) и, как и все встроенные массивы, при использовании его в качестве значения он распадается на указатель на свой первый элемент.char [8]
в C: c-faq.com/ansi/strlitnotconst.htmlЕму нужен адрес памяти, и он имеет адрес памяти. В вашем примере это просто адрес памяти начала строки. То же самое с любой другой переменной массива, которая инициализируется во время компиляции, например, "int array [] = {0, 1, 2, 3};".
Если бы вы использовали бинарный редактор для просмотра исполняемого файла, вы бы увидели там строку «Энтони». Если вы поставите строку "printf (" a находится в% p \ n ", (void *) a);" в вашей программе, затем скомпилируйте и запустите ее, вы увидите адрес.
источник
На самом деле, ему нужен адрес памяти, на который можно указать.
const char* a
означаетa
указатель на строковый литерал или символьную константу.Для указателя всегда требуется адрес, на который указывает указатель, поскольку указатель указывается на конкретный объект в памяти. Так что,
a
и любой другой указатель наconst char
тоже.Строковый литерал, подобный
"Hi My Name is Alfred!"
присваиванию, например:распадается на указатель на адрес первого элемента строкового литерала.
Значит, в свою очередь,
a
присваивается по адресу первого элемента строкового литерала,"Hi My Name is Alfred!"
который может храниться где угодно в памяти, в зависимости от среды выполнения.Не в силах программиста точно хранить строковый литерал. Ваше назначение - только назначать и обрабатывать соответствующий указатель соответствующим образом.
источник