SHPORA.net :: PDA

Login:
регистрация

Main
FAQ

гуманитарные науки
естественные науки
математические науки
технические науки
Search:
Title: | Body:

Массивы: объявление, размещение массивов в памяти, доступ к элементам массива


Массив — это объект данных, в котором хранится несколько единиц данных, идентифицируемых с помощью одного или нескольких индексов. В простейшем случае массив имеет постоянную длину и хранит единицы данных одного и того же типа.

Объявление типа «массив» в Паскале -

type

TArrayType = array[0..9] of Integer; (* Объявления типа "массив" *)

var

arr1, arr2, arr3: TArrayType; (* Объявление трёх переменных-массивов одного типа *)

Доступ к элементам массива:

Для доступа к элементам массива существует два различных способа. Первый способ связан с использованием обычных индексных выражений в квадратных скобках, например, array[16]=3 или array[i+2]=7. При таком способе доступа записываются два выражения, причем второе выражение заключается в квадратные скобки. Одно из этих выражений должно быть указателем, а второе - выражением целого типа. Последовательность записи этих выражений может быть любой, но в квадратных скобках записывается выражение следующее вторым. Поэтому записи array[16] и 16[array] будут эквивалентными и обозначают элемент массива с номером шестнадцать. Указатель используемый в индексном выражении не обязательно должен быть константой, указывающей на какой-либо массив, это может быть и переменная. В частности после выполнения присваивания ptr=array доступ к шестнадцатому элементу массива можно получить с помощью указателя ptr в форме ptr[16] или 16[ptr].



Второй способ доступа к элементам массива связан с использованием адресных выражений и операции разадресации в форме *(array+16)=3 или *(array+i+2)=7. При таком способе доступа адресное выражение равное адресу шестнадцатого элемента массива тоже может быть записано разными способами *(array+16) или *(16+array).



При реализации на компьютере первый способ приводится ко второму, т.е. индексное выражение преобразуется к адресному. Для приведенных примеров array[16] и 16[array] преобразуются в *(array+16).



Для доступа к начальному элементу массива (т.е. к элементу с нулевым индексом) можно использовать просто значение указателя array или ptr. Любое из присваиваний

*array = 2;

array[0] = 2;

*(array+0) = 2;

*ptr = 2;

ptr[0] = 2;

*(ptr+0) = 2;

присваивает начальному элементу массива значение 2, но быстрее всего выполнятся присваивания *array=2 и *ptr=2, так как в них не требуется выполнять операции сложения.

Как известно, массив можно рассматривать не только как группу упорядоченных переменных, объединенных одним именем, но и как одну переменную, называемую полной переменной. Если имеются две полные переменные “A” и “B”, одинаковые по размерам и типу хранимых ими значений, то значение “A” может быть присвоено переменной “B” с помощью одного оператора присваивания B:=A; т.е. не обязательно передавать значения из одного массива в другой поэлементно. Таким образом, массивам внутри процедуры можно передавать значения извне с помощью формальных и фактических параметров, оформленных в виде полных переменных. При использовании массивов в качестве параметров процедур существует ряд ограничений. Во-первых, нельзя обрабатывать одной и той же процедурой массивы разных типов и размеров. Во-вторых, в заголовке процедур для указания типов формальных параметров- полных переменных запрещается использовать безымянные типы, например A:Array[1..20] of Real. Правильно будет предварительно описывать имя типа массива в разделе описаний программы:Type

Mas1=Array[1..20] of Real;

...............................

Procedure Proced(Var A:Mas1);

begin

...............................

end;





Пример использования массивов в качестве формальных и фактических параметров процедуры:



Требуется найти U=Max{Xi}, V=Max{Yi}, где i= 1,2,3,...,N.



Поскольку в этом примере дважды используется алгоритм нахождения наибольшего элемента массива, его удобно оформить в виде процедуры.Program Primer;

Const N=20;

Type Mas=Array[1..N] of Real;

Var i:integer;

u,v:Real;

x,y:Mas;

Procedure Max(a:Mas; Var s:Real);

begin

s:=A[1];

FOR i:=1 TO N DO IF A[i]>s THEN s:=A[i]

end;

Begin

FOR i:=1 TO N DO

begin

Write('X[',i,']= '); Readln(x[i]);

Write('Y[',i,']= '); Readln(y[i]);

end;

Max(x,u); Max(y,v);

Writeln('U= ',U:5:1,'V= ',V:5:1);

Readln

End.

Поскольку в данной программе фактическим параметром является переменная (массив в виде полной переменной), то в качестве формального параметра, принимающего исходные данные, может быть использован не только параметр-значение, но и параметр-переменная: Procedure Max(Var A:Max; Var S:Real).



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



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