Адрес объекта

Материал из Вики ИТ мехмата ЮФУ
Версия от 09:32, 9 марта 2016; Ulysses (обсуждение | вклад) (Новая страница: «Как известно, переменная класса в PascalABC.NET — это ссылка, она хранит адрес объекта в динами…»)

(разн.) ← Предыдущая | Текущая версия (разн.) | Следующая → (разн.)
Перейти к: навигация, поиск

Как известно, переменная класса в PascalABC.NET — это ссылка, она хранит адрес объекта в динамической памяти. В целях безопасности указатели на ссылочные типы (класс — это ссылочный тип) запрещены, поэтому до содержимого объекта через указатель мы добраться не сможем. А вот узнать его адрес можно. Это делается с помощью последовательности трёх шагов:

  1. Получить адрес ссылки («адрес адреса») в переменную-бестиповый указатель (следует стереть память о том, что ссылка указывала на классовый объект)
  2. Присвоить значение-адрес, хранимый в бестиповом указателе, переменной тип «указатель на указатель на целое» (вместо целого может быть размерный любой тип).
  3. Распечатать значение по адресу, хранимому в последней переменной — мы вернёмся к значению адреса объекта, но забыв его тип.

Выполним эту последовательность.

Пусть имеется класс MyClass. Опишем тип PPInteger «указатель на указатель-на-целое»: вместо «целое» можно выбрать любой размерный тип, зато тип PInteger уже есть среди стандартных.

type PPInteger = PInteger^;

Сохраним в переменную типа PPInteger адрес переменной класса: напрямую это сделать нельзя, но можно, как было указано выше, использовать промежуточную переменную-бестиповой указатель.

var c: MyClass := new MyClass;
var p: pointer := @c;
var ppi: PPInteger := p;

Распечатаем адрес объекта, спрятанный в переменной PPInteger, то есть значение по адресу, хранимому в последней переменной.

writeln(ppi^);

Заключение

Такая последовательность действий может казаться переусложнённой. Хорошим мысленным упражнением может быть попытка сократить её. Если вам удастся сделать это, обсудите результат с преподавателем — он укажет на ошибку.