- •Содержание
- •Часть 1. Основные понятия программирования §1.1. Этапы разработки программного обеспечения
- •§1.2. Основные сведения об алгоритмах Понятие алгоритма
- •Свойства алгоритма
- •Формы записи алгоритмов
- •Блок-схемы алгоритмов
- •§1.3. Языки программирования
- •§1.4. Паскаль и Object Pascal, Турбо-Паскаль и Delphi
- •Контрольные вопросы
- •Язык, оболочка и интегрированная среда разработки
- •Часть 2. Общие сведения о языке Паскаль §2.1. Алфавит и служебные слова
- •Описание общих конструкций языка
- •§2.2. Структура программы
- •§2.3. Разделы описаний Описание меток
- •Определение констант
- •Определение типов
- •Описание переменных
- •Контрольные вопросы
- •Часть 3. Простые типы данных Иерархия типов
- •§3.1. Целые типы
- •§3.2. Вещественные типы
- •§3.3. Логический тип
- •§3.4. Литерный тип
- •§3.5. Перечисляемый тип
- •§3.6. Диапазоны (интервальный тип)
- •Дополнительные типы в Delphi
- •Контрольные вопросы
- •Глава 4. Операторы языка Паскаль Выражения
- •§4.1. Оператор присваивания
- •§4.2. Ввод-вывод данных
- •§4.3. Составной оператор
- •§4.4. Пустой оператор
- •§4.5. Безусловный оператор перехода
- •§4.6. Условный оператор
- •§4.7. Оператор цикла с параметром for
- •§4.8. Оператор цикла с предусловием while
- •§4.9. Оператор цикла с постусловием repeat
- •§4.10. Оператор выбора case
- •Контрольные вопросы
- •Глава 5. Процедурное программирование §5.1. Функции
- •Параметры – значения
- •Параметры – переменные
- •Бестиповые параметры
- •§5.2. Процедуры
- •Правила использования подпрограмм
- •Рекурсия
- •Директивы
- •Процедурные типы
- •Пример использования подпрограмм
- •Контрольные вопросы
- •Глава 6. Структурированные типы данных
- •§6.1. Массивы
- •§6.2. Строки
- •§6.3. Записи
- •§6.4. Множества
- •Пример использования множеств
- •§6.5. Файлы
- •Установочные и завершающие операции
- •Операции ввода-вывода
- •Перемещения по файлу
- •Пример работы с файлом
- •Обработка ошибок ввода-вывода
- •Специальные операции
- •Пример объединения двух файлов
- •Текстовые файлы
- •Стандартные текстовые файлы
- •Файлы без типа
- •Контрольные вопросы
- •Глава 7. Динамические структуры данных §7.1. Динамические переменные
- •§7.2. Указатели
- •Работа с динамическими переменными
- •Пример двухсвязанного циклического списка
- •Указатели без типа
- •Контрольные вопросы
- •Глава 8. Низкоуровневые возможности Паскаля §8.1. Язык Ассемблер
- •§8.2. Доступ к аппаратуре Доступ к памяти
- •Доступ к портам ввода-вывода
- •Работа по прерываниям
- •Контрольные вопросы
- •Глава 9. Модули §9.1. Основные понятия
- •§9.2. Использование модулей
- •§9.3. Стандартные модули
- •§9.4. Модуль Crt
- •Работа с экраном в текстовом режиме
- •Работа с клавиатурой
- •Работа со звуком
- •§9.5. Модуль dos
- •§9.6. Графический режим монитора
- •Контрольные вопросы
- •Глава 10. Введение в объектно-ориентированное программирование §10.1. История развития программирования
- •Понятие объекта
- •§10.2. Свойства объектов
- •Раннее и позднее связывание
- •§10.3. Виртуальные методы
- •Конструкторы и деструкторы
- •§10.4. Динамические объекты
- •Скрытые поля и методы
- •Контрольные вопросы
- •Литература
§7.2. Указатели
Тип указателя сам по себе не является динамической структурой данных, часто его называют ссылочным типом. Это обычное четырехбайтное число, содержащее адрес, с которого начинается динамическая переменная. Адрес в архитектуре процессоров фирмы Intel – два целых беззнаковых числа, определяющие номер сегмента памяти и смещение внутри этого сегмента. Указатели используются для установления отношений или связей между динамическими структурами данных. Эти связи могут быть весьма сложными.
Обозначим динамическую структуру, называемую узлом, как:
При наличии одного указателя, показывающего на следующие данные, структура называется списком (в математике это является связанным списком). В общем случае в узле может содержаться несколько указателей, тогда структуру называют деревом (от генеалогического дерева). Список же является вырожденным деревом. Кроме того, на каждый узел может указывать произвольное число указателей.
В стандартном языке Паскаль указатели должны ссылаться на однотипные элементы данных, то есть являются типизированными. Существует специальное значение указателя NIL (пустой указатель), принадлежащее всем типам указателей. В этом случае указатель не указывает ни на какой элемент. Это значение применяется для обозначения конца списка или ветви дерева (по аналогии в функцией EOF).
Пример общего случая использования динамической структуры: ввод данных, располагаемых в порядке возрастания: 50, 40, 10, 20, 30.
Описание указателей:
Туре <имя_указателя>=^<базовый_тип>
Например:
Var z:^real;
Type poin=^T;
T=Record
str:string;
pnt:poin;
end;
Var p,q:Poin;
Здесь p и q – указатели на переменную типа Т (запись), чтобы обратиться к самой переменной, записывается p^, q^ (см. далее).
Замечание 1. Правило языка Паскаль: имя любого типа сначала должно быть определено, и лишь затем использовано. Единственное исключение – при определении ссылочного типа можно использовать имя типа, который определяется далее в тексте программы.
Замечание 2. В программах, использующих указатели, обычно нельзя обойтись без раздела описания типов, поскольку при определении ссылочного типа должно использоваться имя базового типа, как правило сложного, например записи.
Если необходимы указатели на различные типы элементов, то должны быть и различные типы указателей, то есть каждый указатель может ссылаться только на элементы своего типа.
Для того чтобы присвоить переменной ссылочного типа определенное значение, необходимо воспользоваться операцией взятия адреса (указателя), – символа амперсанд «@» и переменной базового типа, например:
z:=@x;
Ссылочные типы можно образовывать от любых других типов, поэтому допустимо определение вида «указатель на указатель». Например, фрагмент программы:
Type p1=^integer;
Var pp1:^p1;
i:integer;
Begin
p1:=@i;
pp1:=@p1;
приводит к следующим связям:
Над значениями ссылочных типов допускаются только две операции сравнения на равенство и неравенство. Они проверяют, ссылаются ли два указателя на одно и то же место в памяти, или нет, например:
Sign:=P1=P2;
If P1<>nil then ...
