Введение в программирование

       

Массивы


В языке Object Pascal можно создавать одномерные и многомерные массивы. Все элементы массива имеют одинаковый тип.

Одномерный массив языка Object Pascal имеет следующее формальное описание:

Идентификатор: array [нач_индекс..кон_индекс] of тип_массива;

Например:

type RealArr = array[1..100] of Real; var int1: array[1..20] of Integer; int2: array[1..20] of Integer; int3, int4: array[1..10] of Integer; real1: array[1..10] of Real; begin Int1 := Int2; end.

Массивы могут объявляться как константы.

Например:

type TCub = array[0..1, 0..1, 0..1] of Integer; const cub1: TCube = (((0, 1), (2, 3)), ((4, 5), (6,7))); { Элементы массива cub1 будут содержать следующие значения: cub1 [0,0,0] = 0 cub1 [0,0,1] = 1 cub1 [0,1,0] = 2 и т.д. }

Массив символов объявляется как массив переменных типа Char. Символьный массив может быть доступен через указатель на массив типа PChar.

Строки можно реализовывать как символьные массивы, ограниченные 0-символом (#0).

Например:

const TempString: array[0..8] of Char = 'Строка'#0; var P: PChar; {Указатель на строку} begin P := 'Строка'; P := @TempString; {Переменная P указывает на значение 'Строка'} end.

Массив символов типа Char и значение типа PChar эквивалентны.

Например:

var MyArray: array[0..5] of Char; MyPointer: PChar; begin MyArray := 'array'; MyPointer := MyArray; MyProc(MyArray); {Эквивалентно вызову MyProc(MyPointer);} end.

Многомерный массив имеет следующее формальное описание:

array[диапазон_первого_индекса, ..., диапазон_n_индекса] of базовый_тип; array[диапазон] of array[диапазон] of array[диапазон] of тип;

Так, объявление



type MyMassiv = array[1..10] of array[1..70] of Integer;

эквивалентно объявлению

type MyMassiv = array[1..10, 1..70] of Integer;

Например:

type MyAr = array[1..10, 1..50] of Real; begin MyAr[1,49]:= 49; end.

По принципу выделения памяти под массив массивы языка Object Pascal делятся на статические и динамические.

Память под статический массив выделяется при его создании.

Динамический массив не имеет фиксированного размера или длины.


При объявлении динамического массива память под него не выделяется. Выделение памяти происходит каждый раз при присвоении значения массиву или при вызове процедуры SetLength.

Создание динамического массива имеет следующее формальное описание:

array of тип_элементов_массива;

Например:

{Объявление динамического массива} var MyAr: array of Integer; {Определение количества элементов в динамическом массиве:} SetLength(MyAr, 10);

Элементы динамического массива всегда индексируются с 0. Переменная типа динамического массива является указателем, и к ней применимы операции над указателями. Для освобождения памяти, занимаемой динамическим массивом, можно присвоить значение nil переменной, ссылающейся на массив. Количество элементов динамического массива определяется процедурой SetLength. Функция Length возвращает количество элементов в динамическом массиве.

При сравнении двух переменных типа динамического массива выполняется сравнение их ссылок, а не значений их элементов. Например:

var A, B: array of Integer; begin SetLength(A, 1); SetLength(B, 1); A[0] := 2; B[0] := 2; {A[0] = B[0] вернет значение True} {A = B вернет значение False} end.

Для усечения динамического массива можно использовать функцию Copy.

Например:

var A: array of Integer; begin SetLength(A, 50); {Оставляет 10 элементов массива A} A := Copy(A, 0, 10); end.

Если при объявлении функции или процедуры формальный параметр определяется как array of тип_массива, то эта функция или процедура может получить в качестве фактического параметра любой динамический или статический массив указанного типа вне зависимости от его размера и индексации его элементов.


Содержание раздела