Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции по паскалю.docx
Скачиваний:
2
Добавлен:
01.07.2025
Размер:
67.39 Кб
Скачать
  1. Указатели

  1. Основные понятия, типы указателей, объявление

Рано или поздно каждый программист, работающий на Паскале, попадает в ситуацию, требующую использования указателей. Указатели требуется применять в следующих случаях:

* Если ваша программа работает с большими объемами данных (общий объем которых превышает 64К).

* Если ваша программа во время компиляция использует данные неизвестного размера.

* Если программа использует временные буферы данных.

* Если ваша программа работает с несколькими типами данных.

* Если ваша программа использует связанные списки данных или объектов.

Давайте подробнее рассмотрим каждую причину использования указателей.

Указатель представляет собой динамическую переменную, значение которого является адрес другой переменной, т.е. прямой адрес ячейки памяти.

Могут быть типизированными или нетипизированными. Типизированные указатели - указатели, которые ссылаются на область данных фиксированного типа.

Для описания используется символ ^.

Схема объявления указателя:

<имя переменной-указатемя>: ^<базовый тип данных>.

Нетипизированные указатели — указатели, базовый тип которых не фиксируется. Такие указатели задают только место (адрес оперативной памяти), без конкретизации типа значения, содержащегося по этому адресу.

Такие указатели определяются с помощью предопределенного идентификатора Pointer.

<переменная~указатель>: Pointer;

  1. Способы задания значений переменных

Чтобы хранить указатели, вам требуется переменная-указатель, а для создания переменной-указателя вам необходим ссылочный тип (или тип "указатель"). Простейшим ссылочным типом является стандартный тип с именем Pointer. Переменная типа Pointer - это общий (нетипизированный) указатель, то есть, просто адрес. Он не содержит информации о том, на что он указывает.

Таким образом, чтобы использовать тот же пример SomeNumber, вы можете присвоить его адрес переменной-указателю:

var

SomeNumber: Integer;

SomeAddress: Pointer;

begin

SomeNumber := 17; {присвоить SomeNumber значение}

SomeAddress := @SomeNumber; {присвоить SomeAddress адрес}

SomeAddress := Addr(SomeNumber); {другой способ получения

адреса}

end.

Нетипизированные указатели в Паскале не используются, поскольку они очень ограничены. Они наиболее полезны, когда указываемый элемент будет изменяться, так как нетипизированный указатель совместим с любым другим указателем. Типизированные указатели значительно более полезны, и как вы узнаете в следующем разделе, они более надежны.

  1. Основные процедуры работы с указателем

DISPOSE(TP:POINTER) – уничтожает динамическую переменную и возвращает в кучу фрагмент динамической памяти, который был зарезервирован

указателем.

NEW(TP:POINTER) – резервирует фрагмент кучи для размещения переменной.

GETMEM(P:POINTER; ZIZE:WORD) –выделяет из кучи блок заданного размера и адрес его начала присваивает указателю.

FREEMEM(P:POINTER; ZIZE:WORD) – освобождает блок заданного размера..

MARK(P:POINTER) – запоминает текущую вершину кучи (адрес начала свободного участка).

RELEASE(P:POINTER) – освобождает участок кучи от адреса с P до конца.