Задать вопрос
Daniro_San
@Daniro_San
Программист

Указатели на память в стеке?

Я знаю про стек и кучу. Знаю про указатели.
Например char *pArr = new char [5] , это мне понятно, выделяем память в куче.
Но что это:
char *cStr = "string";
Где тут выделяется память - в куче или стеке?
Почему тут не работает delete ?
Почему при выводе, например
std :: cout << cStr ;
Выводится "string" , то есть значение, а не адрес значения как обычно с указателями ?
Почему при сравнении, например таком:
char *a = "str" ;
char *b = "str" ;
std :: cout << ( a == b ) ; /// true , но как?

Сравнивается значение ? Это ведь указатели, или ?
  • Вопрос задан
  • 314 просмотров
Подписаться 1 Оценить 2 комментария
Решения вопроса 2
gbg
@gbg Куратор тега C++
Любые ответы на любые вопросы
Итак. В присваивании у нас участвует "string" - это константа. Она отправляется компилятором в область данных программы - это зависит от платформы, куда конкретно. Так что на стеке оказывается сам указатель cStr, который указывает куда-то, куда компилятор засунул ваши буковки.

По второму вопросу (какого черта вы засунули два вопроса в один?) - компилятор - не дурак, он взял два одинаковых набора символов "str", понял, что они одинаковые, и не стал плодить дубляки - в a и b попадает один указатель, потому как компилятор не стал сохранять в программе две идентичные строки.
Ответ написан
@res2001
Developer, ex-admin
Почему при выводе, например
std :: cout << cStr ;
Выводится "string" , то есть значение, а не адрес значения как обычно с указателями ?

Потому что в cout переопределена оператор << для типа char*, так чтобы выводилась именно строка, а не указатель. Чтоб вывести адрес преобразуйте указатель в int и выводите как целое число.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы