Динамическая память (куча)– это оперативная память ПК, предоставляемая программе при ее работе. Динамическое размещение данных означает использование динамической памяти непосредственно при работе программы. В отличие от этого статическое размещение осуществляется компилятором Delphi в процессе компиляции программы. При динамическом размещении заранее не известны ни тип, ни количество размещаемых данных.
Статическими программными объектами называются объекты фиксированного размера, память под которые резервируется на все время выполнения программы. Ссылки на статические объекты (доступ) осуществляются по имени – так называемый непосредственный доступ. При трансляции имя заменяется адресом данного объекта, т.е. номером первой ячейки памяти, отведенной для объекта.
Динамическими программными объектами называются объекты, возникающие, исчезающие, изменяющие свои размеры во время выполнения программы.
Указатели
Оперативная память ПК представляет собой совокупность ячеек для хранения информации – байтов, каждый из которых имеет собственный номер. Эти номера называются адресами, они позволяют обращаться к любому байту памяти. Delphi предоставляет в распоряжение программиста гибкое средство управления динамической памятью – так называемые указатели. Указатель – это переменная, которая в качестве своего значения содержит адрес байта памяти.
Как правило, указатель связывается с некоторым типом данных. Такие указатели называются типизированными. Для объявления типизированного указателя используется значок ^, который помещается перед соответствующим типом, например:
Type
PString = ^String;//тип-указатель на строку
TMas = array[1..100] of word;//статический тип-массив
PMas = ^TMas; //тип-указатель на массив
Var
StPtr : PString;//переменная-указатель на строку
MasPtr : PMas;//переменная-указатель на массив
Mas : TMas;//статический массив
StPtr1 : ^String;//переменная-указатель на строку
P: Pointer;
p1: ^Integer;//переменная-указатель на целое число
p2: ^Real;//переменная-указатель на вещественное число
В Delphi можно объявлять указатель и не связывать его при этом с каким-либо конкретным типом данных. Для этого служит стандартный тип Pointer. Указатели такого рода называются нетипизированными. С помощью таких указателей удобно размещать данные, структура и тип которых меняются в ходе работы программы.
В Delphi можно передавать значения только между указателями, связанными с одним и тем же типом данных. Нетипизированные указатели совместимы с любыми типизированными. За согласованностью типов следит компилятор.
Например,
Var
P1, P2 : ^Integer;
P3 : ^Real;
P : Pointer;
Begin
.....
P1 := P2;
P3 := P1; //ОШИБКА! – Присваивание не допустимо
P := P1;
P := P3;
.....
End.
Над ссылочными переменными определены только две операции сравнения: равно (=) и неравно (<>).