Лекция 10. Динамические структуры данных и указатели.
Общие сведения
Динамические структуры данных, в отличие от изученных нами ранее статических структур, создаются (т е размещаются в оперативной памяти) во время исполнения программы. Статические данные размещаются при загрузке программы и занятая ими память не может быть освобождена или использована для других целей во время исполнения программы.
Отсюда ясно, что основное преимущество структур данных, размещаемых динамически, заключается в экономии памяти. Кроме того, каждая структура (массив, запись, массив записей и т д) размещаяемая динамически, может занимать до 64Кб памяти (а в сумме, вся программа - до 1Мб).
Схема динамического размещения данных:
- Должна быть описана переменная - УКАЗАТЕЛЬ на создаваемую структуру данных. Указатель - это специальный тип данных, хранящий адрес начала участка памяти, выделяемой данной структуре.
- При помощи процедуры New или GetMem с этой переменной связывается (выделяется) необходимый объем памяти из зоны памяти, называемой кучей (heap), причем переменной присваивается адрес начала выделенной памяти. Выделение означает, что система запрещает доступ к этой памяти посторонним. Выделеная память не инициализируется (не заполняется) ничем, т е в ней находится мусор.
- Программа может использовать выделенную память. Например, если pt2 - указатель, то pt2^ используется для обращения к данным: pt2^ := 23.56; xx := sin(pt2^*pi/180); и т д. Существуют и другие способы обращения к данным, находящимся в этой области, например, использование процедур.
- Динамически используемую память можно освобождать и занимать снова. При этом не гарантируется сохранность данных, т е возможно там снова мусор.
Типы указателей, описание указателей
- Типизированные указатели. Описание типа имеет вид:
type <имя типа> = ^<базовый тип>;
где базовый тип - любой известный тип данных (т е в том числе - описанный ранее), кроме файлового. Пример:
type pod = ^double; arab = array [1..100] of integer; par = ^arab;
Описание переменной имеет вид:
var <имя переменной> : <имя типа - указателя> или ^<базовый тип>; Пример:
var p1: pod; xs: par; xs2: ^arab;
- Нетипизированные указатели (pointer). Если используется этот тип указателя, програмист должен заботиться о преобразовании данных к правильному типу например, перед выводом на экран. Описание типа не нужно (есть pointer):
Описание переменной имеет вид:
var ps1,kot,wes: pointer;
Пример использования типизированного указателя.
Программа размещает динамически 100 случайных чисел, находит среднее значение.
Затем освобождает занимаемую память.
Текст программы:
const count = 100;
type arab = array [1..count] of single;
var para: ^arab; ii: integer; sum: single;
begin randomize;
writeln('Наличие памяти в начале = ',memavail);
new(para);
writeln('Наличие памяти после выделения = ',memavail);
sum := 0;
for ii:=1 to count do
begin
para^[ii]:= random*200;
sum := sum + para^[ii];
end;
writeln ('Среднее значение = ',sum/100:0:3);
dispose(para);
writeln('Наличие памяти в конце = ',memavail);
readln;
end.
---- Результаты ----
Наличие памяти в начале = 293296
Наличие памяти после выделения = 292896
Среднее значение = 101.510
Наличие памяти в конце = 293296
----- Примечание: --------
1 Для вычисления среднего значения можно было обойтись без массива para^:
sum := sum + random*200;
2 Выделено памяти: 400 байт, т е число типа single занимает 4 байта.