
- •Федеральное агентство по образованию
- •Структурированные типы данных. Классификация
- •Массивы Определение массива
- •Обращение к элементу массива. Хранение элементов массива. Доступ к элементам массива
- •Действия над массивами
- •Поиск элемента (одномерного ) массива Поиск среди неупорядоченных элементов массива
- •Поиск среди упорядоченных элементов массива
- •Сортировка элементов (одномерного) массива
- •Линейная сортировка (сортировка отбором)
- •Сортировка методом пузырька
- •5 4 3 1 2
- •5 4 3 2 1 Метод быстрой сортировки с разделением
- •Множества
- •Объявление множеств
- •Представление в памяти переменной типа множество
- •Операторы для работы с множествами Проверка принадлежности элемента множеству
- •Операции над множествами
- •Сравнение множеств
- •Применение множеств
- •Процедуры и структурное программирование
- •Преимущества структурного программирования
- •Планирование структурированной программы
- •Метод программирования сверху вниз
- •Определение процедуры
- •Передача управления при вызовах процедур и функций
- •Функции: подпрограммы,возвращающие единственный результат
- •Понятие блока
- •Область действия и время жизни переменных
- •Особенности локальных переменных
- •Особенности глобальных переменных
- •Особенности использования процедур и функций в турбо паскале
- •Опережающее определение процедур и функций
- •Рекурсия и итерация
- •Процедуры и функции как параметры
- •Директивы подпрограмм
- •Отладка и тестирование программ, содержащих подпрограммы
- •Нисходящее тестирование и подпрограммы-заглушки
- •Восходящее тестирование и программы-тестеры
- •Рекомендации по отладке программ, содержащих подпрограммы
- •Использование отладчикадля трассировки процедур
- •Запуск внешних программ
- •Стандартные модули
- •Модуль Crt
- •Модуль Graph
- •Функции
- •Текстовые файлы
- •Нетипизированные файлы
- •Типизированные файлы
- •Прямой доступ
- •Дополнительные функции работы с файлами
- •Обработка ошибок ввода-вывода
- •Указатели и динамические переменные Статические и динамические переменные
- •Адресация памяти в Турбо Паскале
- •Карта памяти Турбо Паскаля
- •Указатели
- •Операция для получения адреса
- •Функции для работы с адресами
- •Процедуры для работы с указателями
- •Присваивание значений указателям
- •Организация ссылок
- •Динамические структурированные переменные Динамические записи
- •Динамические массивы
- •Массивы размером более 64 кбайт
- •Строки с завершающим нулем (asciiz)
- •Процедуры и функции модуля strings
- •Указатели на процедуры и функции
- •Динамические структуры данных
- •Линейные списки
- •60 Лекции по курсу «Языки программирования» Часть II
Процедуры для работы с указателями
procedure GetMem(var p: Pointer; Size: Word);
Выделяет в куче непрерывный участок (блок) памяти размером Size байт, адрес начального байта этого блока присваивается указателю р; максимальное значение Size ограничено и составляет 65528.
procedure FreeMem(var p: Pointer; Size: Word);
Освобождает блок памяти размером Size байт, адрес которого хранится в указателе p; значение указателя р, согласно спецификации языка, становится неопределенным; фактически значение р не изменяется.
procedure New(var p: Pointer);
Создает динамическую переменную того типа, на которую ссылается указатель р, адрес начального байта этой переменной присваивается указателю р; заметим, что обращение к данной процедуре эквивалентно обращению
GetMem(p, SizeOf(p^)); напомним, что функция SizeOf(X) возвращает размер переменной X в байтах.
procedure Dispose(var p: Pointer);
Освобождает блок памяти, занимаемый динамической переменной, адрес которой хранится в указателе р; значение указателя p, согласно спецификации языка, становится неопределенным; фактически значение р не изменяется; заметим, что обращение к данной процедуре эквивалентно обращению
FreeMem(p, SizeOf(p^)).
procedure Mark(var p: Pointer);
Запоминает в указателе р текущее значение встроенного указателя HeapPtr, хранящего адрес вершины кучи (адрес начала физически последнего свободного блока в куче.
procedure Release(var p: Pointer);
Освобождает память, занятую блоками (динамическими переменными), адреса которых превышают значение указателя р; при этом текущее значение встроенного указателя HeapPtr становится равным р; значение указателя р должно быть ранее присвоено процедурой Mark.
Заметим, что процедуры GetMem и FreeMem, New и Dispose, Mark и Release являются парными. Освобождение памяти следует осуществлять либо с помощью процедур Mark и Release, либо с помощью процедур FreeMem и Dispose, смешивать указанные механизмы не следует, так как это может привести к непредсказуемым результатам.
Присваивание значений указателям
Присвоить значение указателю р можно двумя способами:
с помощью оператора присваивания р:=е
где е – выражение, значение которого представляет собой адрес, то есть выражение типа указатель;
путем обращения к процедуре, используя р в качестве фактического параметра-переменной.
При этом следует иметь в виду, что нетипизированный указатель может принимать значение любого другого указателя (и нетипизированного и любого типизированного), а типизированный указатель может принимать значения от нетипизированного указателя и от указателя того же базового типа.
В Паскале определен идентификатор NIL константы, называемой пустым адресом, или адресным нулем. Константа NIL не адресует никакой объект. По присваиванию она совместима со всеми указателями: как нетипизированными, так и типизированными.
Организация ссылок
Ссылка – это способ доступа к объекту программы и соответствующая синтаксическая конструкция.
В Турбо Паскале реализованы три формы ссылок на переменные:
имя переменной;
приведение типа;
вызов функции, возвращаемый тип которой является типизированным указателем, с обязательным последующим квалификатором разыменования.
Каждая из этих форм может иметь последующие квалификаторы в виде индекса, обозначения поля записи или символа разыменования ^ (каре).
Разыменование имеет следующую синтаксическую форму: p^,
где p – типизированный (!) указатель.
Заметим, что только типизированные указатели могут использоваться для организации ссылки, нетипизированные указатели разыменовывать нельзя.
Конструкция р^ представляет собой ссылку на переменную, адрес которой содержится в указателе р, она может использоваться точно так же, как если бы переменная была представлена идентификатором.
Например, в следующем фрагменте ссылка р^ и идентификатор x являются семантическими синонимами, они символизируют один и тот же участок памяти и могут использоваться на равных правах во всех контекстах программы,
var
x: Real;
p: ^Real;
begin
р:=@х; {Теперь р^ и х – синонимы }
р^:=7.25; {То же самое, что х:=7.25 }
end.