Динамические переменные часть 1
Статические и динамические переменные До сих пор мы имели дело с такими переменными, которые описывались в разделе VAR.
Каждой статической переменной в ОЗУ отводится при выполнении программы 2 части: 1) адресная часть 2) часть под значение.
Var K:integer;
В адресной части размещается адрес части под значение, поэтому она и называется адресной. Связь между адресной частью и частью
Var K:integer;
Var K:integer; begin k:=2;
Но данные могут быть организованы и по-другому. Их можно хранить в некоторой области памяти, не обозначая именем переменной, а
Для динамических переменных выделяется память только под адресную часть, а для части под значение память выделяется и
Var K:integer; статическая переменная a:^integer; динамическая переменная begin K:=2;
1 Var 2 k:integer; 3 a, b:^integer; 4 begin 5 k:=2; 6 new (a); 7 a^:=1; 8 new (b); 9 b^:=3; 10 k:=a^+b^; 11 dispose(a); 12
1 Var 2 k:integer;
1 Var 2 k:integer; 3 a, b:^integer;
Резервирование места в памяти под динамическую переменную выполняется с помощью стандартной процедуры new. Процедура new
6 new (a); А^ - место в памяти, куда указывает А – 1 правило
7 a^:=1;
8 new(b);
9 b^:=3;
Над частью под значение можно выполнять любые действия как над переменной данного типа.
10 k:=a^+b^;
Над динамической переменной (указателем) могут выполняться только операции отношения = и <> (не равно) if a=b then Динамические
Освобождение места в памяти под динамическую переменную выполняется с помощью стандартной процедуры dispose. Процедура dispose
11 dispose(a);
11 dispose(b);
Каждое новое обращение к процедуре new new (a) создает новую часть под значение (a^) по новому адресу (там, где есть свободные
107.51K
Category: programmingprogramming

6_динамика1

1. Динамические переменные часть 1

1

2. Статические и динамические переменные До сих пор мы имели дело с такими переменными, которые описывались в разделе VAR.

Транслятор после анализа этого
раздела отводит каждой переменной соответствующее число
ячеек памяти ОЗУ (это зависит от того, простой это тип или
сложный, например, массив, запись, множество) и закрепляет
их за данной переменной на все время работы программы.
Такие переменные называются статическими.
Отведенные ячейки уже не могут использоваться для других
переменных, даже если в какой-то момент выполнения
программы они в дальнейшем больше не понадобятся.
2

3. Каждой статической переменной в ОЗУ отводится при выполнении программы 2 части: 1) адресная часть 2) часть под значение.

3

4. Var K:integer;

Адресная часть
Часть под значение
4

5. В адресной части размещается адрес части под значение, поэтому она и называется адресной. Связь между адресной частью и частью

под
значение неразрывна и сохраняется все время
работы программы (ячейки ОЗУ остаются
занятыми).
В части под значение хранится само значение
статической переменной.
5

6. Var K:integer;

Адресная часть
Часть под значение
ул. Мира
к
ул. Мира
6

7. Var K:integer; begin k:=2;

Адресная часть
ул. Мира
к
Часть под значение
2
ул. Мира
7

8. Но данные могут быть организованы и по-другому. Их можно хранить в некоторой области памяти, не обозначая именем переменной, а

используя ссылку на эту область.
Т.е. аналогично тому, как мы иногда указываем на
некоторого зрителя, говоря «товарищ с 10-го ряда, 5-го
места».
Как мы увидим дальше, такой способ доступа позволяет
динамически захватывать и освобождать память в
процессе работы программы.
Поэтому и сами переменные, память под которые
может выделяться и освобождаться в процессе работы
программы по мере необходимости, называются
динамическими (указателями, переменными ссылочного
типа, ссылками).
8

9. Для динамических переменных выделяется память только под адресную часть, а для части под значение память выделяется и

освобождается по мере
необходимости.
Под какую часть необходимо больше памяти?
Для части под значение!
Тем самым обеспечивается экономия оперативной
памяти!
9

10. Var K:integer; статическая переменная a:^integer; динамическая переменная begin K:=2;

Адресная часть
ул. Мира
к
а
Часть под значение
2
ул. Мира
10

11. 1 Var 2 k:integer; 3 a, b:^integer; 4 begin 5 k:=2; 6 new (a); 7 a^:=1; 8 new (b); 9 b^:=3; 10 k:=a^+b^; 11 dispose(a); 12

dispose(b);
13 edit1.text:=inttostr(k);
14 end;
11

12. 1 Var 2 k:integer;

Адресная часть
Часть под значение
ул. Мира
к
ул. Мира
12

13. 1 Var 2 k:integer; 3 a, b:^integer;

Адресная часть
Часть под значение
ул. Мира
к
ул. Мира
а
b
13

14. Резервирование места в памяти под динамическую переменную выполняется с помощью стандартной процедуры new. Процедура new

выполняет два действия:
1) выделяет место в оперативной памяти для части
под значение (количество выделяемой памяти
соответствует типу)
2) записывает (присваивает) адрес этой
выделенной области памяти в адресную часть в
памяти.
Часть под значение начинает существовать (а,
значит, к ней можно обратиться) только после
выполнения процедуры new.
14

15. 6 new (a); А^ - место в памяти, куда указывает А – 1 правило

Адресная часть
ул. Мира
к
Часть под значение
2
ул. Мира
ул.Красная
а
b
a^
ул.Красная
15

16. 7 a^:=1;

Адресная часть
Часть под значение
ул. Мира
к
ул.Красная
а
b
2
ул. Мира
1
a^
ул.Красная
16

17. 8 new(b);

Адресная часть
Часть под значение
2
ул. Мира
к
ул.Красная
а
ул. Мира
1
ул.Красная
ул.Пацаева
b
a^
b^
ул.Пацаева
17

18. 9 b^:=3;

Адресная часть
Часть под значение
2
ул. Мира
к
ул.Красная
а
ул.Пацаева
b
ул. Мира
1
a^
ул.Красная
3
ул.Пацаева
b^
18

19. Над частью под значение можно выполнять любые действия как над переменной данного типа.

19

20. 10 k:=a^+b^;

Адресная часть
Часть под значение
4
ул. Мира
к
ул. Мира
ул.Красная
а
ул.Пацаева
b
1
a^
ул.Красная
3
ул.Пацаева
b^
20

21. Над динамической переменной (указателем) могут выполняться только операции отношения = и <> (не равно) if a=b then Динамические

Над динамической переменной (указателем)
могут выполняться только операции
отношения = и <> (не равно)
if a=b then
Динамические переменные нельзя вводить и
выводить (адресную часть).
21

22. Освобождение места в памяти под динамическую переменную выполняется с помощью стандартной процедуры dispose. Процедура dispose

стирает адрес части под значение
из адресной части, тем самым освобождает место в
оперативной памяти, выделенное для части под
значение.
Часть под значение перестает существовать (к ней
нельзя обратиться – она недоступна) после
выполнения процедуры dispose.
22

23. 11 dispose(a);

Адресная часть
Часть под значение
ул. Мира
4
к
ул. Мира
1
а
ул.Пацаева
b
Недоступна
ул.Красная
3
b^
ул.Пацаева
23

24. 11 dispose(b);

Адресная часть
Часть под значение
ул. Мира
к
4
ул. Мира
1
а
ул.Красная
3
b
Недоступна
ул.Пацаева
Недоступна
24

25. Каждое новое обращение к процедуре new new (a) создает новую часть под значение (a^) по новому адресу (там, где есть свободные

ячейки) и этот новый адрес записывается в
адресную часть.
При обращении к динамической
переменной всегда существует адресная часть
a, а часть под значение a^ становится
доступна только после выполнения
процедуры new.
25
English     Русский Rules