Задать вопрос

Указатели в C++: что такое «x{»?

Добрый день,
ниже код из которого понятна суть вопроса. Заранее спасибо!
char r = 'R';
char *rPtr = &r;

cout << r << endl; // R
cout << &r << endl; // R{   - что это значит? по идее тут должен быть адрес ячейки памяти для хранения char 'R'
cout << rPtr << endl; // R{
cout << *rPtr << endl; // R
cout << &rPtr << endl; // 0x7ffd015fd1e0
  • Вопрос задан
  • 219 просмотров
Подписаться 1 Оценить 2 комментария
Решения вопроса 2
@Mercury13
Программист на «си с крестами» и не только
Дело в том, что для char* работает особый механизм вывода в поток. Этот указатель воспринимается не как адрес, а как строка Си. Первым символом строки будет, разумеется, R. А дальше — идёт по памяти и выводит все байты подряд, пока не обнаружит 0.

Поскольку после char (1 байт) идёт char* (8 байтов), нам придётся создать семь байтов выравнивания (судя по длине указателя, мы на x64). В этих семи байтах и обнаружились фигурная скобка, ноль и непонятно что.

Поставьте вместо char int — будет всё, как вы думали. Указатель int* выводится без всяких интерпретаций.
Ответ написан
@koronabora
Человек
Это мусор в памяти.

Почему так происходит - char* воспринимается как строка, по стандарту с
Далее - длина, занимаемая в памяти переменной, всегда кратна определенному значению. Как и сам размер, занимаемый в памяти. Это, обычно, 4 байта для х86 и 8 для х64. Технология называется выравниванием.

Вы в строку записали один символ, а символ конца строки не записали. Прочиталась память до конца промежутка выравнивания и вывелась для вас. Там оказался всякий мусор, как всегда. Это все равно, что вывести неинициализированную переменную.

З.Ы. А само выравнивание необходимо для быстрого доступа к памяти. Грубо говоря, память разбивается на ячейки и мы всегда знаем, что для большинства переменный адрес делится на 4 или на 8, например.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

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