- •Часть I
- •1.1 Простейшее консольное приложение. Основные понятия
- •Задачи.
- •1.2 Простые типы
- •Целые типы.
- •Задачи.
- •Символьные типы.
- •Логические типы
- •Перечислимый тип
- •Задачи.
- •Вещественные типы
- •Тип дата-время
- •1.3 Операторы Оператор присваивания
- •Составной оператор
- •Условный оператор if
- •Задачи.
- •Оператор выбора case
- •Задачи.
- •Операторы цикла
- •Задачи.
- •Задачи.
- •Задачи.
- •1.4 Процедуры и функции.
- •Процедуры.
- •Функции.
- •Вызов подпрограмм.
- •Локализация имён.
- •Параметры.
- •Задачи.
- •Перегрузка функций.
- •Процедурные типы.
- •1.5 Динамическая память и указатели
- •1.6 Массивы
- •Статические массивы
- •Задачи.
- •Задачи.
- •Задачи.
- •Задачи.
- •Динамические массивы
- •Параметры-массивы
- •1.7 Строки Строковые типы
- •Стандартные подпрограммы для строк.
- •Строковые выражения
- •Задачи.
- •Преобразование строк в числовые типы и обратно.
- •1.8 Множества
- •Задачи.
- •1.9 Записи
- •Задачи.
- •Литература.
- •Оглавление
Процедурные типы.
Существуют два процедурных типа: тип-процедура и тип-функция. Описание процедурного типа имеет вид:
type <имя процедурного типа> =
<заголовок процедуры или функции без имени>;
Например:
type funcl = function (a, b : real) : real;
Процедурные типы широко применяются в Object Pascal при использовании классов.
1.5 Динамическая память и указатели
Для переменных, указанных в разделе var программы, место в оперативной памяти выделяется в процессе компиляции программы. Такое размещение данных называется статическим. При этом должно быть заранее известно количество переменных и их тип.
Однако часто приходится обрабатывать данные, количество которых и их тип заранее не известны. В этом случае удобно использовать динамическую память. Динамическая память (куча) – эта та оперативная память компьютера, которая выделяется программе в процессе её выполнения. Использование динамической памяти позволяет экономить ресурсы памяти компьютера: в начале там могут быть размещены одни переменные, а затем они могут быть удалены и на их месте размещены другие.
Любая ячейка оперативной памяти – байт – имеет собственный адрес (номер). Адреса переменных можно хранить в переменных специального типа – указателях. Указатели могут быть типизированными и нетипизированными.
Типизированный указатель может хранить адрес переменной определённого типа. Описывается указатель, как и любая другая статическая переменная, в разделе var:
var <имя указателя> : ^ <тип> ;
Например,
var p1, p2 : ^integer; p3 : ^real;
Здесь p1 и p2 – указатели на переменные типа integer, а p3 – указатель на переменную типа real.
Указателю может быть присвоено пустое значение nil , например p1:=nil, означающее, что переменная p1 ни на что не указывает, т.е. не содержит адрес какой-либо ячейки памяти. Как правило, при запуске программы все указатели содержат значение nil.
Если переменные являются указателями на переменные одного и того же типа, то им можно присваивать значения друг друга, например,
p1:=p2;
Для того, чтобы получить значение динамической переменной, на которую ссылается указатель, надо выполнить операцию разыменования. Для этого надо поместить значок ^ справа от указателя, например,
p1^:=p1^+2;
Адрес любой переменной можно получить с помощью операции взятия адреса @. Например, если L – переменная типа integer, то допустим следующий оператор:
p1:=@L;
Для работы с динамическими переменными в программе должны быть предусмотрены:
выделение памяти под динамическую переменную;
присвоение указателю адреса выделенной памяти (инициализация указателя);
освобождение памяти после использования динамической переменной.
Выделение памяти под динамическую переменную осуществляется с помощью процедуры new(x) – указатель на динамическую переменную. При этом в параметре x, являющемся типизированным указателем, сохраняется адрес выделенной области динамической памяти. Процедура dispose(x) освобождает память, занятую динамической переменной, на которую ссылается указатель x. Эта процедура уничтожает динамическую переменную, ранее созданную посредством процедуры new.
Нетипизированный указатель не связан с каким-либо конкретным типом данных. Для описания нетипизированного указателя служит зарезервированное слово pointer, например:
var x: pointer;
Нетипизированные указатели используют в тех случаях, когда в процессе работы программы тип и структура данных изменяются. Для работы с нетипизированными указателями следует использовать следующие процедуры:
procedure GetMem(var p:pointer; size:integer);
Резервирует фрагмент динамической памяти требуемого размера size, в переменной p сохраняется адрес начала этого фрагмента.
procedure FreeMem(var p:pointer[; size:integer]);
Возвращает в динамическую память фрагмент, на который ссылается указатель p.
