Скачать презентацию Указатели 1 Структуры данных 2 Динамическая память 3 Скачать презентацию Указатели 1 Структуры данных 2 Динамическая память 3

27 ПиОА Сем 2 Лекция 5 Указатели.pptx

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

Указатели 1. Структуры данных 2. Динамическая память 3. Указатели 4. Линейные списки 5. Списки Указатели 1. Структуры данных 2. Динамическая память 3. Указатели 4. Линейные списки 5. Списки или массивы? 1

1 Структуры данных Указатели 2 1 Структуры данных Указатели 2

Указатели 1. Структуры данных 2. Динамическая память 3. Указатели 4. Линейные списки 5. Списки Указатели 1. Структуры данных 2. Динамическая память 3. Указатели 4. Линейные списки 5. Списки или массивы? 3

2 Динамическая память (ДП) – это оперативная память ПК, предоставляемая программе при ее работе, 2 Динамическая память (ДП) – это оперативная память ПК, предоставляемая программе при ее работе, за вычетом сегмента данных (64 Кб), стека (16 Кб) и собственно тела программы. Размер динамической памяти можно варьировать. По умолчанию ДП – вся доступная память ПК. ДП – это фактически единственная возможность обработки массивов данных большой размерности. Многие практические задачи трудно или невозможно решить без использования ДП. Для работы с динамическими переменными в программе должны быть выполнены следующие действия: • выделение памяти под динамическую переменную; • инициализация указателя; • освобождение памяти после использования динамической переменной. Программист должен сам резервировать место, определять значение указателей, освобождать ДП. Указатели 4

2 Динамическая память Этапы жизни программы Указатели 5 2 Динамическая память Этапы жизни программы Указатели 5

Указатели 1. Структуры данных 2. Динамическая память 3. Указатели 4. Линейные списки 5. Списки Указатели 1. Структуры данных 2. Динамическая память 3. Указатели 4. Линейные списки 5. Списки или массивы? 6

3 Указатели Указатель, связанный с некоторым определенным типом данных, называют типизированным указателем. Его описание 3 Указатели Указатель, связанный с некоторым определенным типом данных, называют типизированным указателем. Его описание имеет вид: Имя_переменной: ^ базовый-тип; Type A= array [1. . 100] of integer; TA= ^ A ; {тип указатель на массив} Var P 1: ^ integer; {переменная типа указатель на целое число} P 2: ^ real; {переменная типа указатель на вещественное число} Указатели 7

3 Указатели Указатель, не связанный с каким-либо конкретным типом данных, называется нетипизированным указателем. Для 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); {возвращает в кучу 3 Указатели Освобождение динамической памяти осуществляется процедурой: Dispose (переменная_типа_указатель) Dispose (i); {возвращает в кучу 2 байта} Dispose (r); {возвращает в кучу 6 байт} Указатели 9

3 Указатели Операции над указателями Для указателей определены только операции присваивания и проверки на 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'); // символ ^ 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); 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 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 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 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^ 3 Указатели Недопустимо использовать выражения, подобные следующим: Адрес --->R: = sqr( R^) + I^ -17 <---вещественное выражение. Вещественная переменная --->R^: = sqr( R) <---аргумент – адрес. Указатели 16

3 Указатели 17 3 Указатели 17

Указатели 1. Структуры данных 2. Динамическая память 3. Указатели 4. Линейные списки 5. Списки Указатели 1. Структуры данных 2. Динамическая память 3. Указатели 4. Линейные списки 5. Списки или массивы? 18

4 Линейные списки Списком называется структура данных, каждый элемент которой посредством указателя связывается со 4 Линейные списки Списком называется структура данных, каждый элемент которой посредством указателя связывается со следующим элементом. Описание списка: Type ukazat= ^ S; S= record Inf: integer; Next: ukazat; End; Указатели 19

4 Линейные списки Описание типа данных: type PPerson = ^Person; Person = record name: 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 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: 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 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('Добавить 4 Линейные списки Тело программы: begin { Заполнение списка } repeat Append. Record(head); writeln('Добавить ещё одну запись? (1 - да, 0 - нет)'); readln(yes); until yes<>1; Print. List(head); Free. List(head); end. Указатели 24

4 Линейные списки Двунаправленным списком называется структура данных, каждый элемент которой посредством указателя связывается 4 Линейные списки Двунаправленным списком называется структура данных, каждый элемент которой посредством указателя связывается со следующим и предыдущим элементами. Указатели 25

Указатели 1. Структуры данных 2. Динамическая память 3. Указатели 4. Линейные списки 5. Списки Указатели 1. Структуры данных 2. Динамическая память 3. Указатели 4. Линейные списки 5. Списки или массивы? 26

5 Списки или массивы? Указатели 27 5 Списки или массивы? Указатели 27

5 Списки или массивы? Сортировка: элементы входной последовательности просматриваются по одному, и каждый новый 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