- •Процедуры и функции
- •Объявление процедур и функций без параметров
- •Определение процедуры, основные особенности работы
- •Определение функции, основные особенности работы
- •Области видимости процедур и функций
- •Глобальные и локальные переменные
- •Оформление исходного текста процедур и функций
- •Параметры-значения и особенности работы с ними
- •Параметры-переменные и особенности работы с ними
- •Параметры-константы и особенности работы с ними
- •Открытые параметры-массивы и особенности работы с ними
- •Бестиповые параметры и особенности работы с ними
- •Процедурный тип, определение, область применения
- •Явная и неявная рекурсия
- •Типизированные константы
- •Определение файла, общие процедуры и функции для работы с ними
- •Текстовые файлы, особенности,процедуры и функции для работы с ними
- •Типизированные файлы, особенности,процедуры и функции для работы с ними
- •Нетипизированные файлы, особенности,процедуры и функции для работы с ними
- •Модули. Структура модулей Паскаль
- •Особенности использования, видимость содержимого
- •Компилляция модуля(3 режима)
- •Стандартные модули Паскаль
- •Указатели
- •Основные понятия, типы указателей, объявление
- •Способы задания значений переменных
- •Основные процедуры работы с указателем
- •Работа с диманической памятью
- •Основные ошибки при работе с указателями
- •Объекты
- •Ооп, основные понятия и определения
- •Достоинства и недостатки
- •Объявление объектного типа, поля, методов
- •Области видимости в модели объектов Паскаль
- •Наследование
- •Полиморфизм, виртуальные методы
- •Использование экземпляров объекта
- •Динамическая память и деструкторы
Указатели
Основные понятия, типы указателей, объявление
Рано или поздно каждый программист, работающий на Паскале, попадает в ситуацию, требующую использования указателей. Указатели требуется применять в следующих случаях:
* Если ваша программа работает с большими объемами данных (общий объем которых превышает 64К).
* Если ваша программа во время компиляция использует данные неизвестного размера.
* Если программа использует временные буферы данных.
* Если ваша программа работает с несколькими типами данных.
* Если ваша программа использует связанные списки данных или объектов.
Давайте подробнее рассмотрим каждую причину использования указателей.
Указатель представляет собой динамическую переменную, значение которого является адрес другой переменной, т.е. прямой адрес ячейки памяти.
Могут быть типизированными или нетипизированными. Типизированные указатели - указатели, которые ссылаются на область данных фиксированного типа.
Для описания используется символ ^.
Схема объявления указателя:
<имя переменной-указатемя>: ^<базовый тип данных>.
Нетипизированные указатели — указатели, базовый тип которых не фиксируется. Такие указатели задают только место (адрес оперативной памяти), без конкретизации типа значения, содержащегося по этому адресу.
Такие указатели определяются с помощью предопределенного идентификатора Pointer.
<переменная~указатель>: Pointer;
Способы задания значений переменных
Чтобы хранить указатели, вам требуется переменная-указатель, а для создания переменной-указателя вам необходим ссылочный тип (или тип "указатель"). Простейшим ссылочным типом является стандартный тип с именем Pointer. Переменная типа Pointer - это общий (нетипизированный) указатель, то есть, просто адрес. Он не содержит информации о том, на что он указывает.
Таким образом, чтобы использовать тот же пример SomeNumber, вы можете присвоить его адрес переменной-указателю:
var
SomeNumber: Integer;
SomeAddress: Pointer;
begin
SomeNumber := 17; {присвоить SomeNumber значение}
SomeAddress := @SomeNumber; {присвоить SomeAddress адрес}
SomeAddress := Addr(SomeNumber); {другой способ получения
адреса}
end.
Нетипизированные указатели в Паскале не используются, поскольку они очень ограничены. Они наиболее полезны, когда указываемый элемент будет изменяться, так как нетипизированный указатель совместим с любым другим указателем. Типизированные указатели значительно более полезны, и как вы узнаете в следующем разделе, они более надежны.
Основные процедуры работы с указателем
DISPOSE(TP:POINTER) – уничтожает динамическую переменную и возвращает в кучу фрагмент динамической памяти, который был зарезервирован
указателем.
NEW(TP:POINTER) – резервирует фрагмент кучи для размещения переменной.
GETMEM(P:POINTER; ZIZE:WORD) –выделяет из кучи блок заданного размера и адрес его начала присваивает указателю.
FREEMEM(P:POINTER; ZIZE:WORD) – освобождает блок заданного размера..
MARK(P:POINTER) – запоминает текущую вершину кучи (адрес начала свободного участка).
RELEASE(P:POINTER) – освобождает участок кучи от адреса с P до конца.
