Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Зачет по инфе.docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
336.26 Кб
Скачать

9. Динамическая память и указатели.

9.1 Указатель. Синтаксис. Допустимые операции.

При загрузке в память программа располагается в ней следующим образом

Секция кода – это та часть программы где хранится исполняемый код модулей, а также основной программы.

Стек – это специальным образом организованная область памяти для временного хранения данных. Обычно стек используется для хранения фактических параметров передаваемых в подпрограммы, а также локальных переменных и констант.

Динамическая память – это оперативная память компьютера, предоставляемая программе при ее работе. В отличие от статического размещения данных, осуществляемого компилятором Object Pascal в процессе компиляции программы, при динамическом размещении заранее не известны ни тип, ни количество размещаемых данных.

Учитывая, что при работе программа может использовать любые ячейки памяти, то необходимо вести учет занятых или учет свободных ячеек памяти. Иначе возможна ситуация когда различные части программы будут использовать одну и ту же область памяти, что может привести к порче данных и краху приложения. Эту функцию выполняет специальная часть программы называемая менеджером памяти. Менеджер памяти находится в модуле System.

Динами́ческая переме́нная — переменная в программе, место в оперативной памяти под которую выделяется во время выполнения программы. По сути, она является даже не переменной, а участком памяти, выделенным системой программе для конкретных целей.

Указатель – это переменная, которая в качестве своего значения содержит адрес ячейки памяти. С помощью указателей можно размещать в динамической памяти любой из известных в Object Pascal типов данных. Лишь некоторые из них (Byte, Char, Shortlnt, Boolean) занимают во внутреннем представлении один байт, остальные –несколько смежных.

Общий синтаксис объявления типизированного указателя имеет вид: ^<тип>;

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

9.2 Типизированные и нетипизированные указатели.

Указатель может связывается с некоторым типом данных. Такие указатели называют типизированными.

Указатели, не связанные с каким-либо конкретным типом данных, называются нетипизированными. В Object Pascal для этого служит стандартный тип Pointer. Поскольку нетипизированные указатели не связаны с конкретным типом, с их помощью удобно динамически размещать данные, структура и тип которых меняются в ходе работы программы.

var p: pointer; //нетипизированный указатель

9.3 Операция резадресации (разыменования) указателя. Операции взятия адреса. Пустой указатель.

Для определения адреса переменной используется оператор @, например

Var a:integer; //целочисленная переменная

p:^integer;//указатель на целочисленную переменную

begin

...

p:=@a; {вычисляем адрес переменной a и

помещаем его в переменную p}

...

end.

Чтобы получить доступ к данным, адрес которых содержит указатель, необходимо применить к указателю операцию резадресации (разыменования). Сделать это можно с помощью оператора «^», например

var a:integer; //целочисленная переменная

p:^integer;//указатель на целочисленную переменную

begin

...

p:=@a; {вычисляем адрес переменной a и помещаем его в переменную p}

p^:=1;{в ячейку памяти адрес которой содержится в указателе p записываем единицу}

writeln(a);{на экран будет выведена единица}

...

end.

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