ДИНАМИЧЕСКИЕ СТРУКТУРЫ ДАННЫХ Статическое распределение памяти ¡























0_Понятие указателя_Операции.ppt
- Количество слайдов: 23
ДИНАМИЧЕСКИЕ СТРУКТУРЫ ДАННЫХ
Статическое распределение памяти ¡ Память распределяется на стадии компиляции ¡ Перераспределять на стадии выполнения программы – нельзя!
Динамическая переменная - ссылочная переменная ¡ Объем памяти до начала работы программы не известен, т. е. фиксированный объем памяти выделен только под хранение адреса переменной. ¡ Значение переменной хранится в области хипа = «куча» (динамической памяти)
Указатель - ¡ это переменная, хранящая адрес первого байта памяти, начиная с которого находится конкретное значение переменной. ¡ Можно хранить адрес данных или программного кода (например, адрес точки входа в процедуру). ¡ Все указатели – 4 байта ¡ Адрес состоит из двух машинных слов: сегмент + смещение
Объявление указателя Type имя_типа=^базовый тип; Var имя_перем: имя типа; имя_перем: ^базовый тип; Пример: Type pword=^word; Var pw: pword; pw 1: ^ word;
Указатель «в никуда» ¡ NIL ¡ Можно считать константой совместимой с любым ссылочным типом
Выделение места для хранения значения переменной А) процедура new(имя указателя) Выделяет место и адрес начала участка заносит в указатель; Б) функция new(тип указателя); Выделяет место и адрес начала участка возвращает в указатель; С) процедура getmem(указатель, размер в байтах) Выделяет место размером в N байт и адрес начала участка заносит в указатель; Если требуемый объем памяти выделить не удалось происходит аварийное завершение работы программы.
Обращение к значению динамической переменной (разадресация) Имя_перем^ Пример: Var pw: ^ word; Begin new(pw); Pw^: =2; Inc(pw^); Write(pw^); End.
Освобождение памяти 1) Dispose (var p: pointer) 2) Freemem(var p: pointer; size: word) 3) Mark(var p: pointer) 4) Release(var p: pointer) По завершению программы память освобождается автоматически.
Виды указателей: 1. Стандартные – могут хранить адреса переменных любого типа Var P: Pointer; 2. Типизированные - можно хранить только адреса величин указанного типа (любой тип, кроме файлового) Var P: ^integer;
1 Операции с указателями ¡ Nil ¡ Сравнение if p 1=p 2 then … if p 1<>nil then…
2 Операции с указателями ¡ Стандартные функции: addr(x): pointer –возвращает адрес х Seg(x): word - возвращает адрес сегмента х Ofs(x): word - возвращает смещение для х Cseg: word - возвращает значение регистра сегмента кода CS Dseg: word - возвращает значение регистра сегмента данных DS Ptr(seg, ofs: word): pointer – по заданному сегменту и смещению формирует адрес типа pointer
Пример работы с динамическими переменными Type rec = record D: word; S: string; End; Pword = ^word; Var p 1, p 2: pword; p 3: ^rec;
Динамическая память p 1 p 2 p 3 Сегмент данных
Пример работы с динамическими переменными (продолжение) Begin new(p 1); p 2: = new(pword); new(p 3); P 1^: =2; P 2^: =4; P 3^. d: =p 1^; P 3^. s: =‘Вася’;
3 5 2 Вася p 1: ^ p 2: ^ p 1 p 2 p 3
Пример работы с динамическими переменными (продолжение 2) Inc(p 1^); P 2^: =p 1^+p 3^. d; With p 3^ do writeln(d, s); Какие значения?
Пример работы с динамическими переменными p 1: =p 2; Появление «цифрового мусора» !!! 3 5 P 2^ P 1^ p 1 p 2
Вспомогательные функции ¡ Maxavail: longint ¡ Memavail: longint ¡ Sizeof(x): word;
1 Вспомогательные функции (пример) Program demo_memo; Type mas_int=array[1. . maxint] of integer; Var p: ^mas_int; I, n: integer;
2 Вспомогательные функции (пример) Begin writeln (‘ Введите размер массива’); Readln(n); If maxavail < n*sizeof(integer) then Begin writeln (‘ Недостаточно памяти’); Halt end; Getmem(p, n*sizeof(integer)); For i: =1 to n do read( p^[i]); ………. End.
Указатели на процедуры и функции Самостоятельно!
Динамические структуры данных 1. Линейный список 2. Стек 3. Очередь 4. Дерево

