Указательные типы
Указатель может ссылаться на данные конкретного типа (типизированный указатель) или просто на область памяти (нетипизированный указатель). Для объявления нетипизированного указателя используется ключевое слово pointer. Для объявления типизированного указателя используется имя соответствующего типа, перед которым ставится знак разыменования (Л): var
PI : pointer: // нетипизированный указатель
Р2 : Агеа1; // указатель на переменную типа real
РЗ : АМуТуре; // указатель на переменную типа МуТуре.
// определенного пользователем
Работа с переменными указательного типа имеет ряд особенностей. Необходимо помнить, что переменная-указатель является адресом. Чтобы обратиться к значению, на которое данный указатель ссылается, необходимо использовать перед именем переменной знак разыменования (Л).
Например, чтобы работать с переменной Р1 как с переменной вещественного типа, используется обращение ЛР1. Обращение к указателю без знака разыменования будет являться обращением не к значению переменной, а к ее адресу!ПРИМЕЧАНИЕ-----------------------------------------------------------------------------
Переменные указательного типа часто называются динамическими переменными.'
При работе с динамическими переменными им можно присваивать значение nit. Слово nit является зарезервированным и присвоение данного значения указателю означает, что он ни на что не ссылается.
Объявление переменной указательного типа не означает, что при запуске программы для нее будет выделен необходимый объем памяти.
Поэтому перед обращением к динамической переменной необходимо выделить для нее память, а по окончании работы с указателем эту память освободить. Для этого используются специальные процедуры языка Object Pascal, перечисленные ниже.procedure New(var Р: Pointer);
Выделяет необходимый объем памяти для хранения значения переменной, на которую ссылается указатель Р. Объем выделяемой памяти определятся типом указателя. Если недостаточно свободной памяти, генерируется исключительная ситуация EOutOfMemory.
procedure Dispose(var P:Pointer):
Освобождает область памяти, на которую ссылается указатель Р. procedure GetMem(var Р: Pointer; Size: Integer):
Выделяет Size байт для размещения данных, на которые ссылается указатель Р. Если памяти недостаточно, генерируется исключительная ситуация EOutOfMemory.
procedure FreeMem(var Р: Pointer [; Size: Integer]);
Освобождает область памяти, на которую ссылался указатель Р. Необязательный параметр Size определяет, сколько байтов памяти будет освобождено. Если параметр Size указывается, то его значение должно точно соответствовать объему памяти, выделенному переменной Р процедурой GetMem.
procedure FreeAndNiKvar Р);
Освобождает память, на которую ссылается указатель Р, и присваивает указателю Р значение nil.
Для типизированных указателей выделение и освобождение памяти следует производить с помощью процедур New и Dispose.
ПРИМЕЧАНИЕ------------------------------------------------------------------------------
После освобождения памяти с помощью процедур Dispose и FreeMem значение указателя не будет равно nil. Если необходимо проверять, ссылается на что-нибудь указатель или нет, то после освобождения памяти ему следует явно присвоить значение nil или использовать процедуру FreeAndNil, которая, однако, работает только в том случае, если память выделялась процедурой GetMem.
Еще по теме Указательные типы:
- смешанные типы
- Раздел II. Отдельные типы (виды) договоров
- Типы Характеров Человека
- 2.3. Типы и методы выборки
- ТИПЫ СОЦИАЛЬНЫХ ОТНОШЕНИЙ
- Типы энергетических блоков
- Типы дат
- 3.1.6. Смешанные типы
- Смешанные типы
- Смешанные типы
- 1 3.5.6. Смешанные типы
- Смешанные типы .
- 3.7.6. Смешанные типы
- Смешанные типы
- Смешанные типы