- •Содержание
- •Раздел 1.Подпрограммы Общие сведения
- •Процедуры Описание процедур
- •Вызов процедур
- •Процедуры без параметров
- •Процедуры с параметрами
- •Параметры-значения
- •Параметры-переменные
- •Параметры-константы
- •Параметры-переменные без типа
- •Параметры процедурного типа
- •Использование производных типов в качестве параметров подпрограмм
- •Принцип локализации имен
- •Функции Описание функций
- •Вызов функции
- •Рекурсивные подпрограммы
- •Директивы
- •Библиотечные модули пользователя Общие сведения
- •Структура модуля Unit
- •Особенности работы с модулями
- •Подключение к программе внешнего файла
- •Раздел 2.Простейший ввод-вывод Процедуры ввода из стандартного текстового файла Input
- •248 15 4 70 Значения 1-й строки
- •11 Значения 2-й строки
- •Процедуры вывода в стандартный текстовый файл Output
- •Раздел 3.Записи Структура записи
- •Записи без вариантной части
- •Записи с вариантами
- •Оператор присоединения With
- •Константа-запись
- •Раздел 4.Множества Общие сведения
- •Конструктор множества
- •Задание множественного типа
- •Операции над множествами
- •Ввод / вывод значения множественной переменной
- •Типизованные константы-множества
- •Раздел 5.Файлы Общие сведения
- •Процедура Assign
- •Файлы с типом
- •Процедура Assign
- •Процедура Rewrite (f)
- •Процедура Write (f, v1 [, v2, … , vn])
- •Процедура Reset (f)
- •Процедура Read (f, V [, v2, …, vn])
- •Функция Eof(f)
- •Процедура Seek (f, n)
- •Функция Filepos (f)
- •Функция Filesize(f)
- •Процедура Close (f)
- •Текстовые файлы
- •Процедура Assign (f, Name)
- •Процедура AssignСrt(f)
- •Процедура Append (f)
- •Процедура Rewrite (f)
- •Процедура Reset (f)
- •Процедура Read ([f,] v1 [, v2, …, vn])
- •Процедура Readln [([f] [,] [v1, v2, …, vn])]
- •Процедура Write ([f,] e1 [, e2, …, en])
- •Процедура Writeln([f,][e1,e2, …,en])
- •Процедура Close(f)
- •Процедура SetTextBuf (f, Buf [, Size])
- •Процедура Flush (f)
- •Сравнительная характеристика представления информации в файлах с типом и текстовых файлах
- •I. Представление числовой информации.
- •II. Представление текстовой информации.
- •Файлы без типа
- •Процедуры Reset и Rewrite
- •Процедура Blockread
- •Процедура Blockwrite
- •Проверка операций ввода-вывода
- •Раздел 6.Ссылочный тип (тип указатель) Общие сведения
- •Методы работы с динамическими переменными
- •Процедуры New и Dispose
- •Процедуры Getmem и Freemem
- •Процедуры Mark и Release
- •Раздел 7.Динамические структуры данных Динамические цепочки Структура динамической цепочки
- •Формирование цепочки
- •Поиск элемента в цепочке
- •Удаление элемента из цепочки
- •Вставка элемента в цепочку
- •Линейный однонаправленный список
- •Двунаправленные списки
- •Вставка элемента
- •Создание двунаправленного кольцевого списка с заглавным звеном
- •Удаление элемента
- •Поиск элемента
- •Очереди и стеки
- •Очередь lifo
- •Очередь fifo
- •Общие сведения
- •Способы организации таблиц
- •Однонаправленный список.
- •Однонаправленный список с упорядоченными записями.
- •Однонаправленный список с отдельным хранением текста записи.
- •Представление в виде массива.
- •Двоичное дерево.
- •Двоичные деревья Структура двоичного дерева
- •Построение дерева
- •Поиск записи в дереве
- •Включение записи в дерево
- •Удаление записи из дерева
- •Раздел 8.Оверлеи Общие сведения
- •Правила оформления оверлейных программ
- •Инициализация работы оверлеев
- •Включение администратора оверлеев
- •Обработка ошибок администратора
- •Размещение оверлейного файла в ems-памяти
- •Управление оверлейным буфером
- •Литература Основная и дополнительная литература
- •Перечень наглядных пособий, методических указаний, методических материалов и используемых в учебном процессе технических средств
Раздел 6.Ссылочный тип (тип указатель) Общие сведения
В предыдущих разделах рассматривались автоматические переменные – это переменные, порождаемые непосредственно перед выполнением программы или подпрограммы и существующие в течение всего времени ее выполнения. Объем машинной памяти, необходимой для их размещения, не изменяется по ходу выполнения программы. Автоматические переменные порождаются с помощью соответствующих им описаний в разделе объявлений. Например,
Var
X: Integer;
Здесь X – автоматическая переменная.
Место в памяти для хранения значений автоматических переменных выделяется на этапе трансляции. Обращение к этим переменным в программе осуществляется с помощью указания их имен.
Динамические переменные – это переменные, которые порождаются и уничтожаются в процессе выполнения программы, размер значений которых (область отводимой памяти) определяется и может изменяться при выполнении программы.
Для работы с динамическими переменными в языке Паскаль предусмотрен ссылочный тип (тип указатель). Значением этого типа является ссылка на какой-либо элемент программы. По данной ссылке осуществляется непосредственный доступ к этому элементу. В качестве ссылки используется адрес соответствующего элемента в памяти машины.
Синтаксическая диаграмма задания типа указатель имеет вид, который представляет Рисунок 6 .46.
На данной диаграмме <Идентификатор_типа> - это тип динамически размещаемой переменной. В качестве типа может быть использовано имя стандартного или описанного отдельно типа.
Из диаграммы видно, что в Паскале имеется два вида указателей – указатель на элемент некоторого типа (верхнее ребро синтаксической диаграммы) и указатель, не связанный с типом (Pointer).
Рисунок 6.46 - Синтаксическая диаграмма задания типа указатель
Пример 6.1.
Использование указателей при объявлении программных элементов.
Type
Mas = Array [1..10] Of Integer;
Admas = ^Mas; {Admas – тип указателя на массив типа Mas}
P1 = ^Integer; {P1 – тип указателя на тип Integer}
Var
P: ^Integer; {в указателе P будет храниться адрес
динамической переменной целого типа}
Q: ^Char; {в указателе Q будет храниться адрес
динамической переменной типа Char}
Pp: P1; {в указателе Pр будет храниться адрес
динамической переменной целого типа}
Pt: Pointer; {в указателе Pt может храниться адрес
динамической переменной произвольного
типа}
Adrm: Admas; {в указателе Adrm будет храниться адрес
динамического массива типа Mas}
Указатели являются автоматическими переменными ссылочного типа.
Динамические переменные не объявляются в программе. Поэтому единственным средством доступа к ним являются указатели.
Связь указателя Р с динамической переменной схематически отображает Рисунок 6 .47.
Рисунок 6.47 - Связь указателя Р с динамической переменной
Указатель занимает четыре байта памяти.
Иногда необходимо в качестве значения указателя принять пустую ссылку – ссылку, которая не связывает с данным указателем никакой динамической переменной. Для этого служит предопределенная константа Nil. Константа Nil является совместимой по типу с любым типом указателя.
Например, для указателей, объявленных в примере 6.1, можно записать:
Pt := Nil;
P := Nil;
Q := Nil;
Adrm := Nil;
Над значениями ссылочного типа в Паскале нет операций, которые давали бы результат этого же типа.
Над значениями ссылочного типа определены только присваивание и две операции сравнения: = и <>.
Два значения ссылочного типа равны, если они оба есть Nil либо указывают на одну и ту же переменную. Во всех остальных случаях имеет место неравенство.
При присваивании значения ссылочной переменной в правой части оператора присваивания используется ссылочное выражение того же типа, что и тип переменной в левой части. В качестве ссылочного выражения может использоваться:
пустая ссылка Nil;
ссылочная переменная;
ссылочная функция (функция, значением которой является ссылка).
Например, встроенная функция Addr(X) – возвращает адрес элемента X. Здесь X – любая переменная, процедура или функция. Результат функции Addr(X) совместим по присваиванию со всеми типами “указатель”. Поэтому можно, например, написать такие операторы присваивания (для переменных типа указатель, объявленных в примере 6.1):
Pt := Addr (А); {А может иметь любой тип}
P := Addr (В); {В должна иметь тип Integer}
Объявление ссылочной переменной в разделе Var не порождает самой динамической переменной. По этому объявлению транслятор только отводит место в памяти для размещения ссылки (адреса динамической переменной).
