Similar presentations:
6_динамика1
1. Динамические переменные часть 1
12. Статические и динамические переменные До сих пор мы имели дело с такими переменными, которые описывались в разделе VAR.
Транслятор после анализа этогораздела отводит каждой переменной соответствующее число
ячеек памяти ОЗУ (это зависит от того, простой это тип или
сложный, например, массив, запись, множество) и закрепляет
их за данной переменной на все время работы программы.
Такие переменные называются статическими.
Отведенные ячейки уже не могут использоваться для других
переменных, даже если в какой-то момент выполнения
программы они в дальнейшем больше не понадобятся.
2
3. Каждой статической переменной в ОЗУ отводится при выполнении программы 2 части: 1) адресная часть 2) часть под значение.
34. 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. Над частью под значение можно выполнять любые действия как над переменной данного типа.
1920. 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
programming