Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции ТП.docx
Скачиваний:
9
Добавлен:
19.04.2015
Размер:
47.01 Кб
Скачать

Pointer

Var p:pointer;

Sizeof(pointer) = 4 байта

Pointer = Сегмент:Смещение (word:word)

P:=nil(Нулевой адрес)

Операции с pointer:

  1. P:=q;

  2. P<>Q илиp=q

  3. Нельзя read Иwrite

  4. P^ - операция разыменования. Позволяет обратиться к значению по адресуP. (x:=p^)

  5. P:=@x- Берется адрес переменнойx

  6. Addr(x):pointer. @x=addr(x)

  7. Function seg(x):word ( возвращает сегмент)

  8. Functionofs(x):word(Возвращает смещение)

  9. Functionptr(s,o:word):pointer(Возвращает адрес по заданному смещению и сегменту)

Дерево Absolute

Var memory:word absolute $1004:$0000;

St:string[30];

Stlen:byte absolute st;

A:integer;

B: array [1..10] of byte absolute a;

{absolute позволяет разместить переменную по заданному адресу}

Begin

Memory:=16;

St:=’123456789a’

Stlen:=5;

Writeln(st); {выведет ‘12345’, ибо мы ограничили переменной stlen=5 размер который выделится для стринга}

End;

Типизированные ( переменные ) указатели

Ссылочный тип= ^базовый тип

Type mass=array[1..100] of byte;

Var

pInt:^integer;

pbyte:^byte;

pmass:^mass

begin

pint^:=5;

pbyte^:10;

pmass^[pint^]:=pbyte^;

Процедуры работы с кучей

  1. New(p) – резервирует в динамической памяти свободный участок для размещения динамической переменной. В параметр Р превращается указатель на данный участок памяти. (newработает с типизированными указателями)

  2. Getmem(p:pointer;size:word) – резервирует участок размераsizeв байтах

  3. Dispose(p:pointer) - освобождает участок памяти на который указывает Р

  4. Freemam(P:pointer;size:word) – освобождает память по адресуPобъемомsize

  5. Proceduremark(p:pointer); - запоминает текущее значение указателя, но память под указатель не резервируется

  6. Procedurerelean(p:pointer); - Позволяет освободить кучу от указателя Р (запомненного с помощьюmark(p)) и до конца.

  7. Functionmaxavail:longint– возвращает размер в байтах максимального свободного участка памяти

  8. Functionmemavail:longint– Возвращает суммарный объем всех свободных участков куч.

Var x:^Boolean;

Y:Boolean;

Begin

New(x);

X^:=true;

Y:=not x^;

Dispose(x);

Rwiteln(y);

End;

Динамические массивы

Type vector = array[1..1]of integer;

Var a1,a2=^vector;

P:pointer;

N,j,s:integer;

Begin

Writeln(‘Введите число элементв’);

Readln(n);

Mark(p); {Указатель на текущий участок}

Getmem(a1,n*sizeof(integer));

For i:=1 to n do readln(a^[i]);

S:=0;

For i:=1 to n do begin s:=s+a1^[i];

End;

Связные списки

Связный список – это последовательность из nузлов, причем в каждом из них есть поле для связи со следующим (ссылка \ указатель)

Достоинства:

  1. Не требует непрерывного участка памяти для размещения

  2. Операция вставки и удаления происходят гораздо быстрее, чем в массивах

  3. Помогают для реализации графов, деревьев

Недостатки:

  1. Последовательный доступ

В паскале единственным исключением из правила опережающего описания является описание связного списка.

Type sp=^el

El=record

Data:integer;

Next:sp;

End;

Соглашения:

  1. Список без головы (первый узел – первое значение)

  2. Список с головой(первый узел не содержит значимых данных. Только ссылку)

  3. Список с хвостом(последний узел списка не имеет данных, ссылается или на nilили на самого себя)

Function seatch(l:sp; M:integer):sp; {Поиск элементов}

Var [:sp;

B:Boolean;

Begin

P:=l;

B:=true;

While p<>nil and b do

If p^.a=m then b=false

Else p:=p^.n;

Search:=p;

End;

Function tolast(l:sp):sp;

Var p:sp;

Begin

P:=l;

While p^.n<>nil do p:=p^.n;

Tolast:=p;

End;