0_Понятие указателя_Операции.ppt
- Количество слайдов: 25
ДИНАМИЧЕСКИЕ СТРУКТУРЫ ДАННЫХ
Статическое распределение памяти Память распределяется на стадии компиляции ¡ Перераспределять на стадии выполнения программы – нельзя! ¡
Динамическое управление памятью Динамического управления памятью — выделение памяти во время выполнения программы
Динамическая переменная ссылочная переменная Объем памяти до начала работы программы не известен, т. е. фиксированный объем памяти выделен только под хранение адреса переменной. ¡ Значение переменной хранится в области хипа = «куча» (динамической памяти) ¡
Указатель ¡ ¡ это переменная, хранящая адрес первого байта памяти, начиная с которого находится конкретное значение динамической переменной. Можно хранить адрес данных или программного кода (например, адрес точки входа в процедуру). Все указатели – 4 байта Адрес состоит из двух машинных слов: сегмент + смещение
Объявление указателя Type имя_типа=^базовый тип; Var имя_перем: имя типа; имя_перем: ^базовый тип; Пример: Type pword=^word; Var pw: pword; pw 1: ^ word;
Указатель «в никуда» NIL ¡ Можно считать константой совместимой с любым ссылочным типом ¡
Выделение места для хранения значения переменной (способы) А) процедура new(имя указателя) Выделяет место и адрес начала участка заносит в указатель; Б) функция new(тип указателя); Выделяет место и адрес начала участка возвращает в указатель; С) процедура getmem(указатель, размер в байтах) Выделяет место размером в N байт и адрес начала участка заносит в указатель; Если требуемый объем памяти выделить не удалось происходит аварийное завершение работы программы.
операция разыменования — переход от ссылочной переменной к значению, на которое она указывает х^: = 15 означает, что по адресу, который является значением указателя х, записывается значение 15.
Обращение к значению динамической переменной (разадресация) Имя_перем^ Пример: Var pw: ^ word; Begin new(pw); Pw^: =2; Inc(pw^); Write(pw^); End.
Освобождение памяти 1) 2) 3) 4) Dispose (var p: pointer) Freemem(var p: pointer; size: word) Mark(var p: pointer) Release(var p: pointer) По завершению программы память освобождается автоматически.
Виды указателей: 1. 2. Стандартные – могут хранить адреса переменных любого типа Var P: Pointer; Типизированные - можно хранить только адреса величин указанного типа (любой тип, кроме файлового) Var P: ^integer;
Операции с указателями ¡ Nil ¡ Сравнение if p 1=p 2 then … if p 1<>nil then… 1
Операции с указателями ¡ Стандартные функции: addr(x): pointer –возвращает адрес х - возвращает адрес сегмента х Ofs(x): word - возвращает смещение для х Seg(x): word Cseg: word - возвращает значение регистра сегмента кода CS Dseg: word - возвращает значение регистра сегмента данных DS Ptr(seg, ofs: word): pointer – по заданному сегменту и смещению формирует адрес типа pointer 2
Пример работы с динамическими переменными 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: =‘Вася’; 2 p 1: ^ p 1 4 p 2: ^ p 2 2 Вас я p 3
Пример работы с динамическими переменными (продолжение 2) Inc(p 1^); P 2^: =p 1^+p 3^. d; With p 3^ do writeln(d, s); {writeln(p 3^. d); 3 p 1: ^ writeln(p 3^. s); } p 1 5 p 2: ^ p 2 2 Вас я p 3
Пример работы с динамическими переменными p 1: =p 2; 3 p 1 Появление «цифрового мусора» !!! 5 p 2 P 2^ P 1^
Вспомогательные функции 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. Линейный список Стек Очередь Дерево
Где применяют динамические структуры ¡ ¡ Динамические структуры широко применяют и для более эффективной работы с данными, размер которых известен, особенно для решения задач сортировки, поскольку упорядочивание динамических структур не требует перестановки элементов, а сводится к изменению указателей на эти элементы. Например, если в процессе выполнения программы требуется многократно упорядочивать большой массив данных, имеет смысл организовать его в виде линейного списка. При решении задач поиска элемента в тех случаях, когда важна скорость, данные лучше всего представить в виде бинарного дерева.