Работа с динамической памятью осуществляется с помощью указателей. Указатель – это переменная, в качестве своего значения содержащая адрес ячейки памяти. Указатель занимает 4 байта памяти (2 слова – адрес сегмента и смещение).
При помощи указателей мы можем размещать в динамической памяти фактический любой из известных в языке Турб-Паскаль тип данных. Некоторые типы занимают в памяти более одного байта, по этой причине на самом деле указатель будет адресовать лишь первый байт данных.
Чаще всего в Турбо-Паскале указатель связывается с определенным типом данных. В этом случае тип данных называется базовым, а указатель – типизированным. Для объявления типизированного указателя используется значок ^, который должен помещается перед соответствующим типом. Например:
1 2 3 4 5 |
var p_int : ^integer; {указатель на значение типа integer} p_real : ^real; {указатель на значение типа real} |
Выделение динамической памяти под переменную P происходит при вызове процедуры New(P). При этом размер выделяемого блока соответствует размеру базового типа. Для освобождения памяти, занятой динамической переменной P, используется процедура Dispose(P), при этом значение указателя P остается прежним. Чтобы обнулить освободившийся указатель, ему можно присвоить значение Nil.
1 2 3 4 5 6 7 8 |
. . . New(p1); . . . Dispose (p1) p1:=Nil; . . . |
Обращение к переменной базового типа, находящейся в динамической памяти осуществляется по имени указателя со значком ^.
x:=p1^; {переменной x присваивается значение элемента,
на который указывает p1}
p2^:=x; {элементу, на который указывает P2, присваивается
значение переменной x}
Итак, запомните, что сами данные, размещенные в динамической памяти, обозначаются значком ^, и он ставится сразу за указателем. Если же этого значка нет, то имеется в виду только тот адрес, по которому мы и размещали данные.