Если cstring
является указателем, то почему он может получить значение напрямую?
Любой может получить значение, на которое указывает указатель, путем разыменования указателя.Вот что происходит, когда вы делаете std::cout << cstring
.Выбирается правильная перегрузка, которая печатает строку, представленную cstring
, при условии, что это правильно сформированная строка в стиле C.результат, равный целой строке?
cstring
равен const char*
, поэтому *cstring
равен const char
.Передайте это std::cout
, и это вызовет перегрузку, которая печатает один char
.Функция, которая вызывается внутри, даже не знает, что это всего лишь один char
в строке.
В-третьих, cstring
- это непостоянный указатель на постоянный символ, так почемуизменить его значение и не изменить его адрес?
Вы не можете изменить адрес переменной.cstring
находится в фиксированном месте в стеке.Вы изменяете значение cstring
, которое является адресом строки, на которую оно указывает (теперь оно указывает на другую строку, имеющую другой адрес, "string"
, конечно, стиль имеет тот же адрес).
Что вы, вероятно, хотели попробовать, это:
const char* cstring = "string";
std::cout << (void*)cstring << std::endl;
cstring = "foo";
std::cout << (void*)cstring << std::endl;
Теперь вы можете увидеть разные адреса.Один - это адрес "string"
, а другой - "foo"
.