Второй подход является модернизацией предыдущего с той лишь разницей, что не потребуются никакие преобразования типов:
function Max(var a; n:integer):integer;
var
c:array[l.. Maxlnt] of integer absolute a;
m,k:integer;
begin
m:=c[l];
for k:=2 to n do
if m<c[k] then m:=c[k];
Max:=m;
end;
Конструкция с использованием служебного слова absolute означает, что массив с, под который дополнительное место не выделяется, расположен в памяти, начиная с того же адреса, что и массив а.
Третья идея заключается в том, чтобы передать нетипизированный указатель на массив а:
function Max(pa:pointer; n:integer):integer;
var
m,k:integer;
pb:^integer;
begin
pb:=ptr(зед(ра^) , ofs(ра^) ) ;
m:=рb^;
for k:=2 to n do
begin
pb:=ptr(seg(ра^),ofs(ра^)+k*2);
if m < рb^ then m:=рb^;
end;
Max:=m;
end;
Для вызова такой функции при определении максимального элемента в массиве q необходимо задавать адрес аргумента:
max_q:=Max(&q,100);
Этот пример демонстрирует работу с адресами и указателями в Паскале. В нем использована функция ptr, вычисляющая адрес элемента данных по сегменту (seg) и смещению (ofs). Адрес сегмента, задающий начало массива, у локачьного указателя ь совпадает с адресом массива a (seg(pb^)=seg(pa^)), а смещение очередного элемента вычисляется в цикле путем прибавления к смещению начального элемента ofs (ра^) приращения 2*k.
Наверное, все эти три подхода блекнут перед новинкой в лице открытых массивов, появившихся в последних версиях Паскаля. В качестве открытого массива может выступать любой одномерный массив, индексы в котором отсчитываются от 0. Признаком открытого массива является его описание в укороченном виде — без задания индексных границ:
function Max(a:array of integer):integer;
var
m,k:integer;
begin
m:=a[0];
for k:=l to High(a) do
if m < a[k] then m:=a[k];
Max:=m; end;
Для открытых массивов появилась системная функция High, позволяющая узнать максимальный индекс. При использовании открытых массивов вы должны включить соответствующее указание компилятору — {$P+}.