![Скачать презентацию Указатели 1 Структуры данных 2 Динамическая память 3 Скачать презентацию Указатели 1 Структуры данных 2 Динамическая память 3](https://present5.com/wp-content/plugins/kama-clic-counter/icons/ppt.jpg)
27 ПиОА Сем 2 Лекция 5 Указатели.pptx
- Количество слайдов: 28
Указатели 1. Структуры данных 2. Динамическая память 3. Указатели 4. Линейные списки 5. Списки или массивы? 1
1 Структуры данных Указатели 2
Указатели 1. Структуры данных 2. Динамическая память 3. Указатели 4. Линейные списки 5. Списки или массивы? 3
2 Динамическая память (ДП) – это оперативная память ПК, предоставляемая программе при ее работе, за вычетом сегмента данных (64 Кб), стека (16 Кб) и собственно тела программы. Размер динамической памяти можно варьировать. По умолчанию ДП – вся доступная память ПК. ДП – это фактически единственная возможность обработки массивов данных большой размерности. Многие практические задачи трудно или невозможно решить без использования ДП. Для работы с динамическими переменными в программе должны быть выполнены следующие действия: • выделение памяти под динамическую переменную; • инициализация указателя; • освобождение памяти после использования динамической переменной. Программист должен сам резервировать место, определять значение указателей, освобождать ДП. Указатели 4
2 Динамическая память Этапы жизни программы Указатели 5
Указатели 1. Структуры данных 2. Динамическая память 3. Указатели 4. Линейные списки 5. Списки или массивы? 6
3 Указатели Указатель, связанный с некоторым определенным типом данных, называют типизированным указателем. Его описание имеет вид: Имя_переменной: ^ базовый-тип; Type A= array [1. . 100] of integer; TA= ^ A ; {тип указатель на массив} Var P 1: ^ integer; {переменная типа указатель на целое число} P 2: ^ real; {переменная типа указатель на вещественное число} Указатели 7
3 Указатели Указатель, не связанный с каким-либо конкретным типом данных, называется нетипизированным указателем. Для описания нетипизированного указателя в Паскале существует стандартный тип pointer. Имя-переменной: pointer; Var p 1, p 2: ^integer; p 3: ^real; pp: pointer; ……… p 1: = p 2; {допустимое действие } p 1: = p 3; {недопустимое действие} pp: = p 3; {допустимое действие } p 1: = pp; {допустимое действие } Указатели 8
3 Указатели Освобождение динамической памяти осуществляется процедурой: Dispose (переменная_типа_указатель) Dispose (i); {возвращает в кучу 2 байта} Dispose (r); {возвращает в кучу 6 байт} Указатели 9
3 Указатели Операции над указателями Для указателей определены только операции присваивания и проверки на равенство и неравенство. В Паскале запрещаются любые арифметические операции с указателями, их ввод-вывод и сравнение на больше-меньше Указатели можно сравнивать на равенство и неравенство If p 1=p 2 then …. . If p 1<>p 2 then …. . Стандартные функции для работы с указателями: • addr( x) – тип результата pointer, возвращает адрес x (аналогично операции @), где x – имя переменной или подпрограммы; • seg( x) – тип результата word, возвращает адрес сегмента для x; • ofs( x) – тип результата word, возвращает смещение для x; • ptr( seg, ofs) – тип результата pointer, по заданному сегменту и смещению формирует адрес типа pointer. Указатели 10
3 Указатели var R, I : ^integer; begin new(R); new(I); writeln('1'); // символ ^ - доступ к значению по указанному адресу writeln('R: адрес - ', R, ' значение - ', R^); writeln('I: адрес - ', I, ' значение - ', I^); 1 R^ : = 10; I^ : = 12; R: адрес - $8 A 4450 значение - 0 writeln('2'); I: адрес - $8 A 4460 значение - 0 writeln('R: адрес - ', R, ' значение - ', R^); 2 writeln('I: адрес - ', I, ' значение - ', I^); R: адрес - $8 A 4450 значение - 10 R^: = sqr( R^) + I^ - 17; writeln('3'); I: адрес - $8 A 4460 значение - 12 writeln('R: адрес - ', R, ' значение - ', R^); 3 writeln('I: адрес - ', I, ' значение - ', I^); R: адрес - $8 A 4450 значение - 95 R^: = 2; I: адрес - $8 A 4460 значение - 12 inc(R^); 4 dec(I^); R: адрес - $8 A 4450 значение - 3 writeln('4'); I: адрес - $8 A 4460 значение - 11 writeln('R: адрес - ', R, ' значение - ', R^); writeln('I: адрес - ', I, ' значение - ', I^); dispose(R); dispose(I); end. Указатели 11
3 Указатели var a, b : ^ integer; c : integer; Begin new(a); new(b); c : = 1; a^ : = c; b : = a; writeln('a=', a^, ' b=', b^, ' c=', c); writeln('-----'); b : = a; a^ : = 1; c : = 2; a^ : = c; writeln('a=', a^, ' b=', b^, ' c=', c); writeln('-----'); c : = 3; a^ : = 1; a^ : = c; writeln('a=', a^, ' b=', b^, ' c=', c); dispose(a); dispose(b); end. Указатели a=1 b=1 c=1 -----a=2 b=2 c=2 -----a=3 b=3 c=3 12
3 Указатели Сравнение скорости обработки функций с разными типами аргумента uses System; const N = 10000; type PTArray = ^TArray; TArray = array [1. . N] of real; function f. Get. Time: uint 64; var hr, min, sec_100: uint 64; dt : Date. Time; begin dt: = Date. Time. Now; hr : = dt. hour; min : = dt. Minute; sec : = dt. Second; sec_100 : = dt. Millisecond; f. Get. Time : = hr*3600000 + min*60000 + sec*1000+sec_100; end; Указатели 13
3 Указатели procedure p 1 (a : TArray); var i : uint 64; s : real; begin for i : = 1 to N do s : = s + a[i]; end; procedure p 2 (var a : TArray); var i : uint 64; s : real; begin for i : = 1 to N do s : = s + a[i]; end; procedure p 3 (a : PTArray); var i : uint 64; s : real; begin for i : = 1 to N do s : = s + a^[i]; end; procedure p 4 (var a : PTArray); var i : uint 64; s : real; begin for i : = 1 to N do s : = s + a^[i]; end; Указатели 14
3 Указатели var arr 1 : TArray; arr 2 : PTArray; t 1, t 2 : uint 64; begin t 1 : = f. Get. Time; p 1(arr 1); t 2 : = f. Get. Time; writeln(t 2 -t 1); t 1 : = f. Get. Time; p 2(arr 1); t 2 : = f. Get. Time; writeln(t 2 -t 1); new(arr 2); t 1 : = f. Get. Time; p 3(arr 2); t 2 : = f. Get. Time; writeln(t 2 -t 1); t 1 : = f. Get. Time; p 4(arr 2); t 2 : = f. Get. Time; writeln(t 2 -t 1); dispose(arr 2); end. Указатели 15
3 Указатели Недопустимо использовать выражения, подобные следующим: Адрес --->R: = sqr( R^) + I^ -17 <---вещественное выражение. Вещественная переменная --->R^: = sqr( R) <---аргумент – адрес. Указатели 16
3 Указатели 17
Указатели 1. Структуры данных 2. Динамическая память 3. Указатели 4. Линейные списки 5. Списки или массивы? 18
4 Линейные списки Списком называется структура данных, каждый элемент которой посредством указателя связывается со следующим элементом. Описание списка: Type ukazat= ^ S; S= record Inf: integer; Next: ukazat; End; Указатели 19
4 Линейные списки Описание типа данных: type PPerson = ^Person; Person = record name: string; year: integer; Next: PPerson; end; var head: PPerson; yes: integer; Указатели 20
4 Линейные списки Добавление элемента в конец списка: procedure Append. Record( var head: PPerson ); var rec, help: PPerson; begin new(help); help^. Next : = nil; { добавляем в конец списка } write('Введи фамилию : '); readln(help^. name); write('Введи год рождения : '); readln(help^. year); if head=nil then head : = help else begin rec : = head; while rec^. Next<>nil do rec : = rec^. Next; rec^. Next : = help; end; Указатели 21
4 Линейные списки Удаление списка: procedure Free. List( var head: PPerson ); var help: PPerson; begin while head<>nil do begin help : = head; head : = head^. next; dispose(help); end; Указатели 22
4 Линейные списки Доступ к элементам списка: procedure Print. List( head: PPerson ); begin while head<>nil do begin writeln(head^. name, head^. year: 6); head : = head^. next; end; Указатели 23
4 Линейные списки Тело программы: begin { Заполнение списка } repeat Append. Record(head); writeln('Добавить ещё одну запись? (1 - да, 0 - нет)'); readln(yes); until yes<>1; Print. List(head); Free. List(head); end. Указатели 24
4 Линейные списки Двунаправленным списком называется структура данных, каждый элемент которой посредством указателя связывается со следующим и предыдущим элементами. Указатели 25
Указатели 1. Структуры данных 2. Динамическая память 3. Указатели 4. Линейные списки 5. Списки или массивы? 26
5 Списки или массивы? Указатели 27
5 Списки или массивы? Сортировка: элементы входной последовательности просматриваются по одному, и каждый новый поступивший элемент размещается в подходящее место среди ранее упорядоченных элементов Реализация на основе массива const N = 20; var a : array [1. . N] of integer; i, j, key : integer; begin for i : = 1 to N do begin a[i] : = random(101); write(a[i]: 3); end; writeln; Указатели for j : = 2 to N do begin key : = a[j]; i : = j - 1; while (i > 0) and (a[i] > key) do begin a[i+1] : = a[i]; i : = i - 1; end; A[i+1] : = key; end; for i : = 1 to N do write(a[i]: 3); end. 28