Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ТП-ПОСОБИЕ_БАК.doc
Скачиваний:
34
Добавлен:
11.03.2015
Размер:
2.21 Mб
Скачать

Контрольные вопросы

  1. Сформулируйте понятие файлового типа.

  2. Перечислите виды файлов.

  3. Охарактеризуйте текстовые файлы.

  4. Охарактеризуйте компонентные файлы.

  5. Охарактеризуйте бестиповые файлы.

21.Программирование с использованием динамической памяти

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

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

21.1. Указатели и операции над ними

Наименьшей адресуемой единицей памяти компьютера, построенного на базе микропроцессоров фирмы Intel и их аналогов, является байт. Таким образом, память представляет собой последовательность нумерованных байтов. Для обращения к конкретному байту необходимо знать его номер, который называется его физическим адресом.

Память принято делить на слова (2 байта), двойные слова (4 байта) и параграфы (16 байт).

При работе с памятью используется адресация по схеме «база + смещение» (рис.21.1). При этом адрес конкретного байта М определяется как адрес некоторого заданного байта Аб (адрес базы) + расстояние до требуемого байта Асм (смещение).

Рис.21.1. Адресация по схеме «база + смещение»

В микропроцессорах фирмы Intel в качестве адреса базы используют адреса, кратные 16. Четыре последних бита такого адреса равны 0, и их не хранят, а аппаратно добавляют при вычислении физического адреса.

Непрерывный участок памяти, имеющий длину не более 64 Кб и начинающийся с адреса, кратного 16, называется сегментом. Адрес начала сегмента принимают за базу для всего сегмента.

Сегментный адрес и смещение имеют размер по 16 бит (слово). Физический адрес, получаемый при их сложении с учетом отброшенных четырех бит, имеет размер 20 бит и может адресовать память объемом 220байт или 1 Мб (рис. 21.2.).

Рис.21.2. Получение физического адреса

Максимальное смещение равно 216-1, что соответствует 64 Кб памяти. Таким образом, относительно одной базы можно адресовать не более 64 Кб памяти, что ограничивает размер сегмента.

Программа и данные хранятся в памяти фрагментами, каждый из которых расположен в своем сегменте. Различают 3 вида сегментов: кодов (хранится собственно программа), данных (размещаются глобальные переменные и константы), стека (при вызове подпрограмм в стек записывается адрес возврата, в нем размещаются локальные переменные, копии параметров–значений, адреса параметров–переменных и т.п.).

В процессе работы сегментные адреса хранятся в специальных сегментных регистрах:

CS – адрес базы сегментов кодов;

DS – адрес базы сегментов данных;

SS – адрес базы сегмента стека.

Доступ к конкретным участкам сегмента осуществляется через соответствующие смещения.

Для работы с адресами используется специальный тип данных – указатель. Различают указатели двух типов: типизированные и нетипизированные. Типизированные содержат адреса, по которым в памяти размещаются данные определенных типов. Используя эти указатели с данными указанных типов, можно выполнить операции, предусмотренные базовым типом.

Например:

type tpi = ^integer; {объявляем тип «указатель на целое»}

var p : tpi; {объявляем переменную этого типа}

Или

var p: ^integer;

Нетипизированные указатели хранят просто адреса, которые не связаны с данными конкретных типов. Для их объявления используют зарезервированное слово pointer. Например:

var p: pointer; …

Над значениями указателей возможны следующие операции (рис. 21.3):

    • присваивание. При выполнении этой операции указателю присваивается значение другого указателя или nil.

Например:

var p1 , p2 : ^integer;

p3 : ^real;

p : pointer;

{допустимые операции}

p1:=p2; p:= p3; p1:=p; p1:=nil; p:= nil;

{недопустимые операции}

p3:=p2; p1:=p3; …

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

Например:

var i: integer;

p: ^integer;

p:=@i; {указатель p будет содержать адрес переменной i}

    • доступ к данным по указателю (операция разыменования). Чтобы получить доступ к переменной по указателю, необходимо после переменной–типизированного указателя поставить знак «^». Полученное значение имеет тип, совпадающий с базовым типом указателя. Нетипизированные указатели разыменовать нельзя.

Например:

J:=p^; {переменной j присваивается значение целого, расположенного по адресу p}

    • операции отношения. Из всех возможных операций отношения допускаются проверки равенства(=) и неравенства (< >).

Рис.21.3. Операции с указателями.