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

0_Понятие указателя_Операции.ppt

  • Количество слайдов: 25

ДИНАМИЧЕСКИЕ СТРУКТУРЫ ДАННЫХ ДИНАМИЧЕСКИЕ СТРУКТУРЫ ДАННЫХ

Статическое распределение памяти Память распределяется на стадии компиляции ¡ Перераспределять на стадии выполнения программы Статическое распределение памяти Память распределяется на стадии компиляции ¡ Перераспределять на стадии выполнения программы – нельзя! ¡

Динамическое управление памятью Динамического управления памятью — выделение памяти во время выполнения программы Динамическое управление памятью Динамического управления памятью — выделение памяти во время выполнения программы

Динамическая переменная ссылочная переменная Объем памяти до начала работы программы не известен, т. е. Динамическая переменная ссылочная переменная Объем памяти до начала работы программы не известен, т. е. фиксированный объем памяти выделен только под хранение адреса переменной. ¡ Значение переменной хранится в области хипа = «куча» (динамической памяти) ¡

Указатель ¡ ¡ это переменная, хранящая адрес первого байта памяти, начиная с которого находится Указатель ¡ ¡ это переменная, хранящая адрес первого байта памяти, начиная с которого находится конкретное значение динамической переменной. Можно хранить адрес данных или программного кода (например, адрес точки входа в процедуру). Все указатели – 4 байта Адрес состоит из двух машинных слов: сегмент + смещение

Объявление указателя Type имя_типа=^базовый тип; Var имя_перем: имя типа; имя_перем: ^базовый тип; Пример: Type Объявление указателя Type имя_типа=^базовый тип; Var имя_перем: имя типа; имя_перем: ^базовый тип; Пример: Type pword=^word; Var pw: pword; pw 1: ^ word;

Указатель «в никуда» NIL ¡ Можно считать константой совместимой с любым ссылочным типом ¡ Указатель «в никуда» NIL ¡ Можно считать константой совместимой с любым ссылочным типом ¡

Выделение места для хранения значения переменной (способы) А) процедура new(имя указателя) Выделяет место и Выделение места для хранения значения переменной (способы) А) процедура new(имя указателя) Выделяет место и адрес начала участка заносит в указатель; Б) функция new(тип указателя); Выделяет место и адрес начала участка возвращает в указатель; С) процедура getmem(указатель, размер в байтах) Выделяет место размером в N байт и адрес начала участка заносит в указатель; Если требуемый объем памяти выделить не удалось происходит аварийное завершение работы программы.

операция разыменования — переход от ссылочной переменной к значению, на которое она указывает х^: операция разыменования — переход от ссылочной переменной к значению, на которое она указывает х^: = 15 означает, что по адресу, который является значением указателя х, записывается значение 15.

Обращение к значению динамической переменной (разадресация) Имя_перем^ Пример: Var pw: ^ word; Begin new(pw); Обращение к значению динамической переменной (разадресация) Имя_перем^ Пример: 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: Освобождение памяти 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: Виды указателей: 1. 2. Стандартные – могут хранить адреса переменных любого типа Var P: Pointer; Типизированные - можно хранить только адреса величин указанного типа (любой тип, кроме файлового) Var P: ^integer;

Операции с указателями ¡ Nil ¡ Сравнение if p 1=p 2 then … if Операции с указателями ¡ Nil ¡ Сравнение if p 1=p 2 then … if p 1<>nil then… 1

Операции с указателями ¡ Стандартные функции: addr(x): pointer –возвращает адрес х - возвращает адрес Операции с указателями ¡ Стандартные функции: 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; Пример работы с динамическими переменными 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 Пример работы с динамическими переменными (продолжение) 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^. Пример работы с динамическими переменными (продолжение 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 Появление «цифрового Пример работы с динамическими переменными p 1: =p 2; 3 p 1 Появление «цифрового мусора» !!! 5 p 2 P 2^ P 1^

Вспомогательные функции Maxavail: longint ¡ Memavail: longint ¡ Sizeof(x): word; ¡ Вспомогательные функции Maxavail: longint ¡ Memavail: longint ¡ Sizeof(x): word; ¡

1 Вспомогательные функции (пример) Program demo_memo; Type mas_int=array[1. . maxint] of integer; Var p: 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 < 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. Линейный список Стек Очередь Дерево Динамические структуры данных 1. 2. 3. 4. Линейный список Стек Очередь Дерево

Где применяют динамические структуры ¡ ¡ Динамические структуры широко применяют и для более эффективной Где применяют динамические структуры ¡ ¡ Динамические структуры широко применяют и для более эффективной работы с данными, размер которых известен, особенно для решения задач сортировки, поскольку упорядочивание динамических структур не требует перестановки элементов, а сводится к изменению указателей на эти элементы. Например, если в процессе выполнения программы требуется многократно упорядочивать большой массив данных, имеет смысл организовать его в виде линейного списка. При решении задач поиска элемента в тех случаях, когда важна скорость, данные лучше всего представить в виде бинарного дерева.