Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЛК№15.doc
Скачиваний:
4
Добавлен:
24.08.2019
Размер:
72.7 Кб
Скачать

Лекция №15. Работа с памятью. Динамические переменные

1. Понятие динамической переменной

Раньше мы рассматривали типы данных, которые называются статическими. Они характеризуются тем, что имеют один и тот же размер на протяжении выполнения всего блока, в котором были объявлены. Во время компиляции для каждого статического объекта в соответствии с его типом выделяется определенный объем памяти, который нельзя использовать для других целей до завершения работы программы.

Количество объектов при работе с такими данными и является постоянным во время выполнения программы. Однако существует ряд задач, где статические структуры неэффективны или просто неприемлемы из-за недостатка памяти для реализации алгоритма.

В языке Turbo Pascal имеются средства создания динамических структур данных, которые позволяют изменять количество объектов в программе, образовывать объекты, выделять для них память и уничтожать, когда в них исчезает необходимость.

2. Распределение памяти

Во время выполнения программы на Turbo Pascal операционная система выделяет для программы три сегмента: сегмент кода, сегмент данных и сегмент стека. Первые два сегмента не могут занимать более 64 Кбайт памяти. Последний ограничен только аппаратными возможностями компьютера.

Естественно, не для каждой прикладной программы хватит 64 Кбайт памяти для размещения данных. В этих случаях нам на помощь приходит механизм динамического распределения памяти. Область динамически распределяемой памяти занимает всю оставшуюся после размещения всех блоков программы память и называется heap-памятью, или хипом, или кучей.

Операционная система MS - DOS все адресуемое пространство делит на

сегменты. Сегмент - это участок памяти размером 64 К байт. Для задания адреса необходимо определить адрес начала сегмента и смещение относительно начала сегмента.

Программист может сам определить переменные для хранения адресов памяти. Такие переменные называются указателями.

Указатели делятся на стандартные и определяемые программистом.

Величины стандартного типа pointer предназначены для хранения адресов данных произвольного типа:

var p : pointer;

Программист может определить указатель на данные или подпрограмму конкретного типа. Как и для других нестандартных типов, это делается в разделе type:

type pword = ^word; { читается как "указатель на word" }

...

var pw : pword;

Такие указатели называются типизированными. Можно описать указатель на любой тип данных, кроме файловых.

Тип указателя на данные можно описать и непосредственно при описании переменной:

var pw : ^word;

Для указателей определены только операции проверки на равенство и неравенство и присваивания. Правила присваивания указателей:

  • Любому указателю можно присвоить стандартную константу nil, которая означает, что указатель не ссылается на какую-либо конкретную ячейку памяти.

  • Указатели стандартного типа pointer совместимы с указателями любого типа.

  • Указателю на конкретный тип данных можно присвоить только значение указателя того же или стандартного типа.

Операция @ и функция addr позволяют получить адрес переменной:

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]