
Лекции Шафеевой / Секретные файлы Шафеевой)) / 2семестр / л11распред памяти07
.ppt
Указатель |
динамическая переменная |
Р:^Char; |
|||||||
Р:^Char; |
|
Р^:=‘*’ |
Begin |
||||||
|
|
|
|
|
|
|
|
new(p); |
|
|
адрес |
|
|
|
|
|
|||
|
|
|
|
`*` |
|
Р^:=`*`; |
|||
|
|
|
|
|
|
|
|||
|
|
|
|
|
|
… |
|||
^ операция разыменования. |
|||||||||
End; |
Выделение и освобождение памяти New, Dispose, GetMem, FreeMem, во время работы программы.
Указательная переменная Р может быть в трех состояниях.
1. Содержать адрес какой – либо переменной, память под
|
которую уже выделена. |
|
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
P |
P^ |
|
|
|
|
|
|
|
|
|
|
|||
|
|
адрес |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2. |
Содержать специальный пустой |
|
|
|
|
P |
||||||||||
|
|
|
nil |
|
|
|
|
|
|
|
|
|||||
|
|
|
|
|
|
|
|
|
|
|
||||||
адрес nil. |
|
|
|
|
|
|
|
|
|
|
|
|
|
|||
|
|
|
|
|
|
|
|
|
|
|
|
|
||||
|
|
|
|
|
|
|
|
|
|
|
|
|
||||
3. |
Находиться в неопределенном |
|
|
P |
|
? |
|
|
|
|
|
|||||
|
|
|
|
|
|
|
|
|||||||||
состоянии. |
|
? |
|
|
|
|
|
|
Марченко А.И., Марченко Л.А. Программирование в среде TurboPASAL1 базовый
курс 7.0.-К.:ВЕК+,1999. – 464 с.

|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||
|
Действие |
|
|
|
|
|
|
|
Результат |
|
|
|
||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1. Объявление |
а |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
? |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||
|
type Pint =^ integer; |
b |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||
|
var a, b: Pint; |
? |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
a |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
a^ |
|
|
2. Выделение |
|
адрес1 |
|
|
|
|
|
|
|
|
|
|
|
||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
памяти |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
b |
|
адрес2 |
|
|
|
|
|
|
|
|
|
|
b^ |
|
|||||
|
New(a); |
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
New(b); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||
|
|
|
a |
|
|
|
|
|
|
|
|
|
|
|
|
a^ |
|
|||
|
3. Занесение |
|
|
адрес1 |
|
|
|
|
|
|
1 |
|
|
|||||||
|
информации |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
a^:=1; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
b |
|
адрес2 |
|
|
|
|
|
|
|
|
2 |
|
b^ |
|
||||
|
b^:=2; |
|
|
|
|
|
|
|
|
|
|
|
||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
a |
|
|
|
|
|
|
|
|
|
|
|
|
|
a^ |
|
|
|
|
|
4. Копирование |
адрес1 |
|
1 2 |
|
|
a^=b^ |
|
||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||
|
информации |
b |
|
|
|
|
|
|
|
|
|
|
b^ |
a<>b |
|
|||||
адрес2 |
2 |
|
|
|
|
|||||||||||||||
|
a^:= b^; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2

Действие |
Результат |
|
5.a) Копирование адреса a:=b
5. b) После освобождения памяти a:=b;
Dispose (a);
6. Присваивание пустого указателя b:= nil;
a |
адрес2 |
2 |
|
a^=b^ |
|
|
|
|
a^ |
||
b |
адрес2 |
2 |
a=b |
||
b^ |
|||||
|
|
|
|
||
a |
адрес2 |
|
b^ |
|
|
|
|
|
b адрес2 2
bnil
b^
Процедура New(A) выделяет память для указателя А Процедурой Dispose(A) освобождается область памяти
3

|
|
|
Сравнение статических и НЕСВЯЗНЫХ |
|
|
|
|
ДИНАМИЧЕСКИХ ДАННЫХ |
|
var |
указатель |
|
New Dispose |
|
|
|
|
||
|
СТРУКТУРА ДАННЫХ ОБЫЧНЫЕ ПЕРЕМЕННЫЕ |
ДИНАМИЧЕСКИЕ ПЕРЕМЕННЫЕ |
||
|
|
|
|
|
|
1. Простая |
type Tint =1..100; |
type Tint =1..100; |
|
|
var X: Char; |
var PX: ^Char; |
||
|
переменная |
|||
|
Y: Tint; |
PY: ^Tint; |
||
|
|
|
||
|
|
|
begin |
begin |
|
|
|
|
New(PX); |
|
|
|
|
New(PY); |
|
|
|
X:=`*`; |
PX^:=`*`; |
|
|
|
Y:=3; |
PY^:=3; |
|
|
|
… |
… |
|
|
|
|
Dispose (PX); |
|
|
|
|
Dispose (PY); |
|
|
|
end. |
end. |
|
|
|
|
|
|
|
|
|
|
4

2. Массив
3. Запись
type
Vect= array[1..3] of Byte; var X: Vect;
i: Byte; begin
for i:=1 to 3 do Read (X[i]); ….
end.
type Rec = record
A:Char;
B:Byte end;
var X: Rec; Begin
X.A:=`*`;
X.B:=7;
…
end.
type
Vect= array[1..3] of Byte; var PX: ^Vect;
i: Byte; begin
New(PX);
for i:=1 to 3 do Read (PX^[i]); ….
Dispose (PX);
end.
type Rec = record
A:Char;
B:Byte
end; var PX: ^Rec; begin
New(PX);
PX^.A :=`*`;
PX^.B :=7;
…
Dispose (PX); end.