Главная страница Случайная страница КАТЕГОРИИ: АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
Program dinam_peremennie;
Var p1, p2, p3: ^integer; Begin new (p1); {создаются переменные типа integer и их адреса new (p2); присваиваются указателям p1, p2, p3 } New (p3); p1^: =10; p2^: =p1^+1; p3^: =p1^+p2^; writeln (‘сумма чисел p1^ и p2^=', p3^); Readln; End. Таким образом, значение, на которое указывает указатель, обозначается с помощью крышки ^, поставленной после имени указателя. Если за именем указателя нет ^, то это адрес ячейки памяти, если же есть ^, то это значение, которое расположено по данному адресу. р1^ - значение, на которое указывает указатель р1. р1 – указатель (адрес ячейки, где расположено число). Отметим, что нельзя смешивать указатели и данные в одно выражение: p1: = sqr(p1^); – так делать нельзя!!! После того, как динамическая переменная стала не нужна, ее можно уничтожить, а освободившиеся ячейки вернуть в «кучу», для этого используется процедура dispose(p); где р – переменная-указатель. После выполнения этой процедуры ячейки, содержащие значение p^ будут считаться свободными, но при этом значение p^ не изменится. Следовательно, использование p^ может привести к порче других динамических переменных, поэтому рекомендуется сразу после обращения к процедуре dispose указателю присвоить: p: = Nil; Процедура dispose(p) предназначена для освобождения указателя, который раньше получил свое значение с помощью процедуры new(p). В том случае, если указатель имеет тип pointer и получил значение с помощью процедуры Getmem (p, size), тогда для его освобождения используется процедура Freemem (p, size). Динамические структуры данных
При решении многих задач возникает необходимость в запоминании последовательности значений, количество которых заранее не известно и может меняться при выполнении программы. Из условия задачи вытекает принцип формирования этой последовательности и способ доступа к ее элементам. По этим признакам последовательности данных могут быть систематизированы в виде динамических структур данных следующих типов: 1. Очередь организована по принципу FIFO (First Input First Output – первым вошел и первым вышел). Схематически можно представлять это в виде трубочки с одним входом и с одним выходом:
2. Стек организован по принципу LIFO (Last Input First Output - последним вошел, первым вышел). Схематически это можно изобразить в виде трубочки с запаянным концом.
3. Список является обобщением очереди и стека. В списке возможен доступ к любому элементу, он допускает вставку любого элемента в любое место. А также исключение элемента из любого места списка. Если мы попытаемся использовать статические переменные структурных типов (массивы, записи, множества) для организации перечисленных динамических структур, то мы столкнемся с большими трудностями: 1) при описании переменных структурного типа необходимо заранее указать число их компонентов, а в данном случае оно неизвестно; 2) компоненты статических переменных структурных типов располагаются в памяти в подряд расположенных ячейках. Поэтому добавление элемента в такую структуру или удаление элемента из нее связано с перемещением всех остальных элементов статической структуры на новое место в памяти. Это требует больших затрат машинного времени. При использовании динамической памяти эти проблемы устраняются, поскольку: 1) отсутствует описание динамических элементов; 2) элементы динамических структур размещаются в памяти в виде цепочки связанных структур. Такое размещение в памяти предполагает, что каждый элемент может быть помещен в любое свободное место, но при этом в каждом элементе есть указатель на следующий или предыдущий элемент связанной структуры.
|