Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ГИА 2024 Ответы УТС (НЕ ВСЕ).docx
Скачиваний:
17
Добавлен:
10.06.2024
Размер:
3.12 Mб
Скачать
  1. Динамические переменные. Операция разыменования. Размещение/освобождение динамических переменных.

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

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

Оператор @ обозначает взятие адреса переменной (получение указателя на переменную).

Оператор ^ в коде обозначает разыменование указателя и получение значения переменной.

Оператор ^ при объявлении типа обозначает использование указателя. Например, PPoint = ^TPoint обозначает, что объект типа PPoint будет указателем на объект типа TPoint.

Каждая из таких переменных занимает в памяти 4 байта. Например, в разделе объявления переменных можно определить указатель на строку следующим образом:

Var PS:^String;

Знак «^» – поставленный перед типом String, обозначает описание указателя на память, которая может быть выделена строке. Переменная PS будет занимать в памяти 4 байта, в них и будет храниться адрес начала выделенной памяти для строки. Здесь под адресом будем понимать не физический адрес памяти, а особым образом рассчитанный адрес внутри участка памяти, выделенного для динамических переменных. Этот участок памяти описывается отдельным дискриптором, как это принято в защищенном режиме работы процессора. Весь процесс выделения и освобождения динамической памяти контролируется системой Delphi. Графически это можно представить так:

Память под динамические переменные выделяется и освобождается во время выполнения программы по мере необходимости. Приведем основные процедуры и функции для работы с динамическими переменными:

Procedure New(var P:Pointer); – процедура выделения памяти под динамическую переменную P. Здесь тип Pointer определяет любой указатель на область памяти. Эта процедура выделяет блок памяти такой длины, как это было указано в типе динамической переменной P. В P записывается адрес начала блока выделенной памяти;

Procedure Dispose(var P:Pointer); – процедура освобождения динамической памяти, которая ранее была выделена процедурой New для переменной P;

Procedure GetMem(var P:Pointer; Size:Integer); – процедура выделения блока динамической памяти длиной Size байт и записи адреса начала этой памяти в переменную P. Эта процедура позволяет выделять блок памяти любой длины, независимо от типа указателя P;

Procedure FreeMem(var P:Pointer; Size:Integer); – процедура освобождения динамической памяти, которая ранее была выделена переменной P процедурой GetMem;

Function AllocMem(Size:Cardinal):Pointer; – функция возвращает указатель на блок выделенной динамической памяти длиной Size байт и обнуляет эту память, в отличие от процедуры GetMem. Освобождать эту память можно процедурой FreeMem;

Var AllocMemCount:Integer; – системная переменная, которая определяет число динамических блоков памяти для данного приложения. Эта переменная доступна только для чтения;

Var AllocMemSize:Integer; – системная переменная, которая определяет общий размер всех динамических блоков памяти для данного приложения. Такие переменные позволяют контролировать процесс выделения и освобождения динамической памяти;