КАТЕГОРИИ: Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748) |
Выделение и освобождение динамической памяти
Сравнение Присваивание Разыменование Определение адреса Операции с указателями Физический адрес любой переменной можно узнать при помощи стандартной функции: addr(<имя_переменной>): <указатель> или унарной операции @ <имя_переменной>. Пример: var P: Pointer; intP: ^integer; x: integer; … P:= addr(x); P:= @x; intP:= addr(x); intP:= @x; Указатель – это лишь адрес ячейки памяти. Для обращения к содержимому такой ячейки используют операцию, называемую разыменованием. Записывается такая операция следующим образом: <имя_указателя> ^ Отметим, что операция разыменования применима лишь к типизированным указателям. Пример: var intP: ^integer; x: integer; … intP:= @x; intP^:= 10; writeln(intP^); В случае указателей при присваивании получают лишь новый адрес памяти. Содержимое самих ячеек памяти остается неизменным. Пример: var intP1: ^integer; intP2: ^integer; … x:= 3; intP1:= @x; y:= 4; intP2:= @y; intP1:= intP2; {оба указателя ссылаются на значение 4} intP2^:= 7; {оба указателя ссылаются на значение 7} В операции присваивания могут фигурировать только указатели, адресующие переменные одинаковых типов данных. Обойти эти ограничения позволяет универсальность нетипизированного указателя Pointer, совместимого с указателями любых типов: Пример: var intP1: ^integer; intP2: ^integer; realP: ^real; P: Pointer; … intP1:= intP2; {нельзя realP:= intP1} P:= intP1; realP:= P; У указателей также существует свой "ноль", который означает, что указатель не указывает никуда: p:= nil; Для указателей определены две операции сравнения: равно (=) и не равно (<>). Две переменные, описанные как указатели на один и тот же тип данных, считаются совпадающими, если они указывают на одну и ту же область памяти. Для разнотипных указателей сравнения невозможны. Однако сравнивать типизированный и нетипизированный указатели можно. Указатели – это лишь адрес ячейки памяти, а о состоянии самой ячейки должен позаботиться программист. Вся динамическая память может располагаться как сплошной массив, состоящий из байтов и называемый кучей. Куча размещается в памяти компьютера следом за областью памяти, которую занимает тело программы. Перед помещением данных в кучу программист должен подготовить участок памяти, куда данные собственно будут помещены. После завершения использования данных использованное место необходимо за собой очистить. Процедура New(P) резервирует в памяти участок для значения того типа, на который ссылается указатель P, и устанавливает в указатель адрес зарезервированного участка. Пример: var P1: ^Integer; ... New(P1); P1^:=5; Процедура Dispose(P) освобождает участок памяти, на которую указывает типизированный указатель P. Пример: Dispose(P1); P1:=nil; Процедуры New и Dispose применимы только для типизированных указателей. При работе с нетипизированными указателями можно воспользоваться следующими процедурами. Процедура GetMem(P, Size) выделяет из кучи блок памяти размером Size (максимум 64 Кбайта) и устанавливает в указатель P ссылку на неё. Процедура FreeMem(P, Size) уничтожает в куче блок памяти размером Size по адресу P.
Дата добавления: 2014-01-06; Просмотров: 385; Нарушение авторских прав?; Мы поможем в написании вашей работы! Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет |