Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методичка часть_23.doc
Скачиваний:
0
Добавлен:
01.03.2025
Размер:
1.96 Mб
Скачать

13.1.2.Действия с указателями

ОПЕРАЦИЯ ПРИСВАИВАНИЯ ДОПУСТИМА

  • для двух однотипных указателей

  • пары: типизированный и нетипизированный указатели.

  • другие присваивания не допустимы!

ОПЕРАЦИИ С УКАЗАТЕЛЯМИ

  • операция взятия адреса @

- возвращает адрес памяти, в которой размещен объект-операнд;

  • операция разадресации ^

- возвращает объект, адрес которого содержится в указателе;

  • операция =

- возвращает результат сравнения двух указателей на равенство (два указателя равны, если они хранят адрес одной и той же ячейки памяти или оба равны NIL);

  • операция <>

- возвращает результат сравнения двух указателей на неравенство.

Других операций сравнения указателей нет.

NIL

- обозначает пустой или нулевой указатель (но это не ноль в прямом смысле).

- единственная константа-указатель!

- можно присваивать любому (типизированному или нетипизированному) указателю.

ФУНКЦИИ РАБОТЫ С УКАЗАТЕЛЯМИ

  • ADDR(X) /@X/

- возвращает адрес памяти, в которой размещен X (тип POINTER)

  • PTR(S,C)

- возвращает указатель (тип POINTER), построенный по сегменту S и смещению C

  • OFS(X)

- возвращает смещение адреса указанного объекта X (тип WORD)

  • SEG(X)

- возвращает сегмент адреса указанного объекта X (тип WORD)

  • MAXAVAIL

- возвращает размер в байтах наибольшего непрерывного участка кучи

  • MEMAVAIL

- возвращает размер в байтах общего свободного пространства кучи

  • SIZEOF(X)

- возвращает длину в байтах внутреннего представления объекта X

  • DSEG

- возвращает значение, хранящееся в регистре DS, т.е. адрес сегмента данных программы

  • CSEG

- возвращает значение, хранящееся в регистре CS, т.е. адрес начала кода программы

13.1.3.С труктура оперативной памяти и компоненты динамической памяти

ВЫДЕЛЕНИЕ И ОСВОБОЖДЕНИЕ ДИНАМИЧЕСКОЙ ПАМЯТИ

  • NEW()

- выделяет память из кучи под динамически размещаемую переменную, адрес которой будет помещен в P.

  • DISPOSE(P)

- возвращает память, выделенную под P в кучу. при этом содержимое p не изменится. Во избежание ошибок желательно добавлять P:=NIL.

  • MARK(P)

- запоминает в p текущее значение HeapPtr.

  • REALSE(P)

- возвращает в кучу фрагмент памяти, начиная от P до конца кучи.

  • GETMEM(P,SIZE)

- резервирует память из кучи объемом SIZE, адрес начала блока помещается в P.

  • FREEMEM(P,SIZE)

- освобождает (возвращает в кучу) блок памяти объемом SIZE, начиная с P.

13.2Односвязный список

- модель представления знаний, представляющая собой набор записей (RECORD), каждая из которых содержит ссылку (указатель) на последующий элемент той же структуры. Такая организация структуры обеспечивает возможность просмотра и корректировки списка.

Ключевое понятие списка – голова – указатель на первый элемент списка

(обычно обозначается HEAD). В некоторых задачах используется также

указатель на последний элемент списка – LAST.

ОПИСАНИЕ ЭЛЕМЕНТОВ СПИСКА НА ЯЗЫКЕ ПАСКАЛЬ

TYPE

LIST=^NODE; {тип указателя на элементы списка}

NODE= RECORD

DATA: INTEGER;

NEXT: LIST

END;{тип элементов списка: данное – integer и next - указатель на следующий элемент}

VAR

HEAD: LIST; {голова - указатель на первый элемент списка}

LAST : LIST; {хвост - указатель на последний элемент списка}

Таким образом, определен список из целых чисел.

ПРОЦЕДУРА СОЗДАНИЯ СПИСКА

PROCEDURE NEWLIST (VAR HEAD: LIST);

{создает новый пустой список}

BEGIN

HEAD := NIL;

END;

ПРОЦЕДУРА ВЫВОДА ЭЛЕМЕНТОВ СПИСКА НА ЭКРАН

PROCEDURE PRINTLIST(HEAD: LIST);

VAR P: LIST; {указатель-счетчик}

BEGIN

P:=HEAD; {начальное значение счетчика - голова}

WHILE P<>NIL DO {пока не конец списка}

BEGIN

WRITE(P^.DATA:6); {вывод содержимого элемента списка}

P:=P^.NEXT {переход к следующему элементу списка}

END;

WRITELN;

END;

ПРОЦЕДУРА ДОБАВЛЕНИЯ ЭЛЕМЕНТА В ГОЛОВУ СПИСКА

PROCEDURE ADDHEADLIST(VAR HEAD: LIST; X: INTEGER);

VAR P: LIST; {указатель на новый элемент}

BEGIN

NEW(P); {резервируем в куче память для нового элемента}

P^.DATA:=X; {заносим значение поля data – число x}

P^.NEXT:=HEAD; {следующим в списке будет тот элемент, который сейчас находится в голове; заносим его адрес в next}

HEAD:=P {теперь головой становится новый элемент}

END;

ФУНКЦИЯ ВЫЧИСЛЕНИЯ СУММЫ ЭЛЕМЕНТОВ СПИСКА

FUNCTION SUM(HEAD: LIST):INTEGER;

VAR P: LIST; {указатель-счетчик}

S:INTEGER; {накопитель суммы}

BEGIN

S:=0; {начальное значение суммы - 0}

P:=HEAD; {начальное значение счетчика - голова}

WHILE P<>NIL DO {пока не конец списка}

BEGIN

S:=S+P^.DATA; {добавляем содержимое элемента списка к сумме}

P:=P^.NEXT {переход к следующему элементу списка}

END;

SUM:=S;

END;

ПРИМЕР ПРОГРАММЫ, РАБОТАЮЩЕЙ СО СПИСКОМ

VAR X:INTEGER;

BEGIN

NEWLIST(HEAD); {создаем новый пустой список}

WRITE('NEW='); READLN(X); {вводим элемент для добавления в список}

WHILE (X<>0) DO {пока не введен ноль}

BEGIN

ADDHEADLIST(HEAD,X); {добавляем введенное значение в список}

WRITE('NEW='); READLN(X) {вводим элемент для добавления в список}

END;

PRINTLIST(HEAD); {распечатаем построенный список}

WRITELN(SUM(HEAD)); {выведем сумму элементов построенного списка}

END.