Данные типа «указатель».Pascal

Указатель pascal

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

В качестве типа содержимого ячейки (базового типа) может быть использован любой стандартный тип или имя нестандартного типа.

Указателю может быть присвоено значение другого указа­теля, причем в операторе присваивания (слева и справа от знака:=) должны участвовать указатели с одинаковым базовым типом или один из указателей должен быть нетипированным.

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

Операция @означает взятие адреса переменной: @A – адрес переменной A (или адрес первого байта массива или структуры A). Операцияозначает взятие содержимого: ^b – содержимое ячейки с адресом b (сравните положение значка ^ с тем, что используется при объявлении указателей). ^b можно использовать точно так же, как и переменную базового для указателя b типа.

Пример.

Имеется встроенная константа nil, представляющая собой пустой или нулевой указатель. Эта константа, естественно, используется при присваивании и сравнении. Значение nil означает, что указатель не хранит значения адреса какой-либо ячейки памяти. Нельзя путать пустые указатели с неопределенными, в которых может храниться остаточное, мусорное значение. Использование неопределенных указателей очень опасно, так как может привести к несанкционированному обращению к памяти.

Процедура new(p),где p– типированный указатель, выделяет область памяти, на которую указывает (т.е. адрес которой хранит) р. При этомp^ представляет собой переменную базового для р типа и называется динамической переменной. Процедура dispose(p)возвращает выделенную с помощьюnew(p) память в кучу, после примененияdispose(p) значение указателя р становится неопределенным (не становится равнымnil!). Применениеdispose к пустому указателю вызывает сообщение об ошибке.

Процедура GetMem(p,n)выделяет область динамической памяти из n байтов, на которую указывает р– типированный или нетипированный указатель. Функция AllocMem(p)возвращает значение нетипированного указателя на область из n байтов; в отличии от GetMem, AllocMemзаполняет выделенную область нулями. Процедура FreeMem(p)освобождает память, полученную с помощьюGetMem или AllocMem.

Добавить комментарий