Это может быть простой вопрос, но почему const char * не нужен адрес памяти для указания?
Пример:
const char* a = "Anthony";
и не:
const char *a = // Address to const char
как и любые другие типы делают?
Это может быть простой вопрос, но почему const char * не нужен адрес памяти для указания?
Пример:
const char* a = "Anthony";
и не:
const char *a = // Address to const char
как и любые другие типы делают?
Ответы:
Вы можете представить эту декларацию
const char* a = "Anthony";
следующим образом
const char string_literal[] = "Anthony";
const char *a = string_literal;
То есть компилятор создает массив символов со статической продолжительностью хранения, в котором хранится строка, "Anthony"
и указателю присваивается адрес первого символа массива (из-за неявного преобразования указателей массива в указатели на их первые символы) a
.
Вот демонстрационная программа, которая показывает, что строковые литералы являются символьными массивами.
#include <iostream>
#include <type_traits>
decltype( auto ) f()
{
return ( "Anthony" );
}
template <size_t N>
void g( const char ( &s )[N] )
{
std::cout << s << '\n';
}
int main()
{
decltype( auto ) r = f();
std::cout << "The size of the referenced array is "
<< std::extent<std::remove_reference<decltype( r )>::type>::value
<< '\n';
g( r );
return 0;
}
Выход программы
The size of the referenced array is 8
Anthony
Размер строкового литерала (массива, в котором хранится строковый литерал) равен тому, 8
что строка также содержит символ завершающего нуля ' \0'
.
В демонстрационной программе выражение
std::extent<std::remove_reference<decltype( r )>::type>::value
может быть заменено только выражение
sizeof( r )
почему const char не нужен адрес памяти для указания? *
Оно делает.
C-строка буквального типа
"Anthony"
распадается по адресу 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*
не нужен указатель на адрес памяти?»
На самом деле, ему нужен адрес памяти, на который можно указать.
const char* a
означает a
указатель на строковый литерал или символьную константу.
Для указателя всегда требуется адрес, на который указывает указатель, поскольку указатель указывается на конкретный объект в памяти. Так что, a
и любой другой указатель на const char
тоже.
Строковый литерал, подобный "Hi My Name is Alfred!"
присваиванию, например:
const char* a;
a = "Hi My Name is Alfred!";
распадается на указатель на адрес первого элемента строкового литерала.
Значит, в свою очередь, a
присваивается по адресу первого элемента строкового литерала, "Hi My Name is Alfred!"
который может храниться где угодно в памяти, в зависимости от среды выполнения.
Не в силах программиста точно хранить строковый литерал. Ваше назначение - только назначать и обрабатывать соответствующий указатель соответствующим образом.