- •Модуль и его структура
- •Структура модуля
- •Список uses
- •Интерфейс
- •Реализациия
- •Инициализация и завершение
- •Ключевые слова
- •Слово const
- •Слово type
- •Слово var
- •Комментарии
- •Переменные
- •Типы данных и переменные
- •Преобразование типов
- •Знаки операций
- •Массивы
- •Одномерные массивы
- •Многомерные массивы
- •Функции Low и High
- •Динамические массивы
- •Короткая строка
- •Длинная строка
- •Расширенная строка
- •Строка с терминальным нулем
- •Операции со строками Слияние
- •Извлечение символа
- •Управляющие символы в строках
- •Разбиение литерала по строкам программы
- •Сравнение строк
- •Строковые функции
- •Форматирование строк
- •Множества
- •Объявление записи
- •Оператор with
- •Массивы записей
- •Совместимость типов данных
- •Указатели
- •Статические и динамические переменные
- •Размещение динамических переменных
- •Разыменование указателя
- •Управление вычислениями Операторы if, then, else
- •Выполнение нескольких инструкций.
- •Вложенные условия.
- •Циклы Элементы структуры цикла
- •Цикл for…
- •Функции Pred и Succ
- •Цикл while
- •Цикл repeat
- •Управление циклами
- •Оператор goto
- •Оператор case
- •Область видимости идентификаторов
- •Подпрограммы
- •Процедуры и функции
- •Объявление и определение подпрограммы
- •Параметры подпрограмм
- •Локальные процедуры и функции
- •Перегрузка подпрограмм
- •Параметры по умолчанию
- •Включение внешнего файла в модуль
Указатели
Указатель суть адрес переменной в памяти компьютера. Говорят, что он указывает на переменную. Таким образом, указатель косвенно связан с реальными данными.
Новый термин: Указатель есть переменная, которая содержит адрес памяти, по которому записано значение другой переменной.
Рассмотрим пример. Допустим, что в некоторую подпрограмму надо передать адрес записи. Определить адрес экземпляра записи можно с помощью оператора @ следующим образом:
var
MLRecord : TMailingListRecord;
APtr : Pointer;
begin
{ Заполним запись данными. }
APtr := @MLRecord;
SomeFunction(APtr);
end;
Переменная APtr (ее тип есть Pointer) используется для запоминания адреса записи MLRecord. В данном случае мы имеем дело с так называемым нетипизированным указателем или указателем без типа. Нетипизированный указатель просто есть адрес переменной. Существуют и типизированные указатели. Допустим что нам необходимо определить специальный тип указателей на записи TMailingListRecord. Объявление типизированного указателя имеет вид:
type
PMailingListRecord = ^TMailingListRecord;
TMailingListRecord = record
FirstName : string;
LastName : string;
Address : string;
City : string;
State : string;
Zip : Integer;
end;
Здесь тип PMailingListRecord определяется как указатель записи типа TMailingListRecord. Необходимость применения в программах типизированных указателй возникает довольно часто. В следующем разделе мы рассмотрим примеры их использования.
ПРИМЕЧАНИЕ: В приведенном выше фрагменте кода поля записи объявлены как длинные строки. Если переменные типа TMailingListRecord надо будет хранить в файле, такое объявление полей не подходит. Это связано с тем, что все записи файла должны иметь одинаковый размер (число байт). Длинные строки имеют переменную длину, поэтому нет гарантии того, что все записи будут одинаковы по длине. Если записи будут храниться в файле, для объявления строковых полей следует использовать короткие строки с явной спецификацией длины.
Статические и динамические переменные
Во всех примерах, которые рассматривались выше, использовались статические переменные. Они размещаются в локальной памяти программы, которая называется стеком.
Новый термин: Локальные переменные размещаются в блоке памяти, который называется стеком программы. Локальные переменные называют статическими.
В любой момент когда программе требуется разместить переменную в памяти, используется стек. Как только необходимость в переменной отпадает, память освобождается. Обычно так происходит при входе в подпрограмму или в любой другой локальный блок кода. При выходе из подпрограммы память освобождается. Все это делается автоматически.
Размещение статических переменных в стеке имеет как преимущества, так и недостатки. С одной стороны, выделение памяти происходит максимально быстро. С другой стороны, стек имеет фиксированный размер; изменить его объем во время выполнения программы нельзя. Если в какой–то момент программа исчерпает резервы стека, ее поведение станет непредсказуемым. Она может зависнуть или закончиться аварийно. На 32-битных компьютерах такие ситуации возникают реже чем на 16-битных, но все же проблеме переполнения стека следует уделить внимание.
Если в программе используются переменные предопределенных типов или небольшие массивы, то можно обойтись статическими переменными. Но если необходима обработка записей большого размера, то лучше воспользоваться динамическими переменными. Динамические переменные размещаются в области памяти, которая называется кучей. Объем кучи определяется свободным объемом оперативной памяти и объемом свободного места на жестком диске. Стандартная настройка Windows поддерживает размер кучи 100MB. Таким образом, программе может быть доступен практически неограниченный объем памяти. (Сведение различных уровней памяти – оперативной (RAM) и дисковой к одному уровню называется виртуальной памятью). Однако, при этом имеет место незначительная потеря производительности, поскольку реализация виртуальной памяти предусматривает обмен данными с диском. Кроме того, работа с динамическими переменными требует большего внимания со стороны программиста.
Новый термин: Динамической называется переменная или объект, которая размещается в куче.
Новый термин: Куча прикладной программы Windows есть вся виртуальная память компьютера.