Статическая переменная(массив) имеет имя, по которому к ней можно обращаться, размер заранее известен (задается при написании программы), память выделяется при объявлении размер, нельзя увеличить во время работы программы.
Динамическая переменная(массив) не имеет имени, обращаться нужно через адрес памяти, размер заранее не известен, память выделятся при работе программы, можно увеличить во время работы программы.
Указатель – это переменная, в которую можно записывать адрес другой переменной (или блока памяти).
Объявление:
var pC: ^char; // адрес символа
Как записать адрес:
pC:= @ m //адрес переменной m
Обращение к данным:
pI^ //Получение значения.
для выделения памяти используют процедуру GetMem
GetMem( указатель, размер в байтах );
указатель должен быть приведен к типу pointer –указатель без типа, просто адрес какого-то байта в памяти;
с динамическим массивом можно работать так же, как и с обычным (статическим);
для освобождения блока памяти нужно применить процедуру FreeMem:
FreeMem ( указатель );
Структура (запись) – это тип данных, который может включать в себя несколько полей – элементов разных типов (в том числе и другие структуры).
Объявление(выделение памяти):
Type Tbook = record
author: string[40]; // автор, строка
title: string[80]; // название, строка
year: integer; // год издания, целое
pages: integer; // кол-во страниц, целое
end;
Так же возможно использование массива записей:
var mass: array of Tbook;
Или файла записей:
var f: file of Tbook;
Обращение:
readln(Book.author); // ввод
readln(Book.title);
Book.year := 1998; // присваивание
if Book.pages > 200 then // сравнение
writeln(Book.author, '.', Book.title); // вывод
Записи так же можно сортировать, указывать на них(использовать указатели) . При сортировке могут возникнуть такие проблемы, как случайно копирование записей, что не есть хорошо для памяти. Чтобы этого избежать достаточно использовать вспомогательный массив указателей на эти записи и сортировать только их.
type PBook = ^TBook; { новый тип данных }
var p: array[1..N] of PBook;
begin
{ заполнение массива записей}
for i:=1 to N do
p[i] := @aBooks[i];
for i:=1 to N-1 do
for j:=N-1 downto i do
if p[j]^.year > p[j+1]^.year then begin
temp := p[j];
p[j] := p[j+1];
p[j+1] := temp;
end;
for i:=1 to N do
writeln(p[i]^.title, p[i]^.year:5);
end.
17.