Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
39
Добавлен:
12.05.2015
Размер:
423.94 Кб
Скачать

Работа с динамической памятью

Указатели: виды, описание, использование. Динамические переменные.

1

Структура программы в оперативной памяти

В IBM PC-совместимых компьютерах память условно разделена на сегменты (64К).

Адрес каждого байта составляется из номера сегмента и смещения.

Компилятор формирует

сегмент кода, в котором хранится программа в виде

машинных команд, и сегмент данных, в котором выделена +

память под глобальные переменные программы.

Динамическая память

Сегмент стека

Сегмент данных

Сегмент кода

16 бит

4 бита

Адрес сегмента

0000

16 бит

 

Смещение

 

Физический адрес

 

20 бит

 

2

3

Основные понятия

Переменные для хранения адресов областей памяти называются

указателями (или переменными ссылочного типа).

В указателе можно хранить адрес данных или программного кода.

Адрес занимает четыре байта и хранится в виде двух слов, одно из которых определяет сегмент, второе — смещение.

16 бит

4 бита

Адрес сегмента

0000

+

16 бит

 

Смещение

Физический адрес

20 бит

Динамическая память

Сегмент стека

Сегмент данных

Сегмент кода

4

Виды указателей

стандартные:

 

определяемые программистом:

var p : pointer;

 

type pword = ^word;

 

 

var pw : pword;

 

 

или:

 

 

 

 

var pw : ^word;

5

Операции с указателями

• присваивание;

p1 := p2;

• проверка на равенство и неравенство: if p1 = p2 then …

Правила присваивания указателей

•Любому указателю можно присвоить стандартную константу nil, которая означает, что указатель не ссылается на какую-либо

конкретную ячейку памяти: p1 := nil;

•Указатели стандартного типа pointer совместимы с указателями любого типа.

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

6

Переменная указатель может быть в трёх состояниях

var p : pointer; (4 байта в статической)

1. Содержать адрес какой – либо переменной память

под которую уже выделена:

2

p^

p адрес

2.Содержать специальный пустой адрес

p Nil

3.Находиться в неопределённом состоянии

p

?

?

 

 

7

Операция разадресации или разименования

применяется для обращения к значению переменной, адрес которой хранится в

2

указателе:

var p1: ^integer; // указатель

 

 

p1

 

 

 

 

p1^ := 2; inc(p1^); writeln(p1^); // разименование!

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

8

Динамические переменные

создаются в хипе во время выполнения программы с помощью подпрограмм new или getmem:

Процедура new( var p : тип_указателя )

Функция new( тип_указателя ) : pointer

Процедура и функция new обычно применяются для типизированных указателей.

Процедура getmem( var p : pointer; size : word )

Эту процедуру можно применять и для указателей типа pointer.

9

Освобождение памяти

•Процедура Dispose(var p : pointer)

освобождает участок памяти, выделенный New.

•Процедура Freemem(var p : pointer; size : word)

освобождает участок памяти размером size, начиная с адреса p выделенный Getmem.

•Если память выделялась с помощью New, следует применять Dispose, в противном случае — Freemem.

•Значение указателя после вызова этих процедур становится неопределенным.

10

Соседние файлы в папке Алгоритмы и структуры данных