Приклади програм з використанням масиву вказівників

Приклад 1:

Використання масиву вказівників:

 

Для визначення розміру ділянки пам'яті, яка необхідна для розміщення динамічної змінної певного типу, зручно користуватися функцією SizeOf (тип). Ця функція повертає кількість байтів, необхідних для розміщення значень вказаного типу (стандартного чи визначеного користувачем).

У Паскалі при розміщенні масиву в статичній пам'яті кількість елементів масиву, їхню впорядкованість і тип треба задавати явно до початку виконання програми. Тому, якщо границі масиву заздалегідь точно невідомі, то їх вибирають "із запасом" (це стосується переважно верхньої межі діапазону індексу). Якщо кількість елементів масиву n набагато менша за nmax, то певна частина пам'яті "простоює". Для малих значень nmax і n це не страшно, але ситуація змінюється, якщо ці значення є достатньо великими, а елементи масиву теж мають великі розміри.

Program Mas_P;

Const

nmax = 30;

Type

vect=array [1..nmax] of ^геаl;

Var

a: vect;

x: real;

i, n, kmin, kmax: byte;

Begin

repeat: // Введення кількості чисел

write('Kilkist chysel<=30:');

read(n);

until (n<=nmax) and (n>=l);

for i:=l to n do New(a[i]); //Виділення пам'яті для масиву

Writeln(‘Chysla: ');

for i:=l to n do геаd(а[і]^); // Введення чисел

kmin:=l; kmax:=l;

 

for і: =2 to n do // Пошук мінімум та максимуму

begin

if a[kmin]^>а[і]^ then kmin:=i;

if a[kmax]^<=а[і]^ then kmax:=i

end;

x:= а[kmin]^;

а[kmin]^:= а[kmax]^;

а[kmax]^:=х;

 

for i:=l to n do write (а [і] : 6: 2, ' '); // Виведення

readln(n);

 

for i:=l to n do Dispose (a[i]); // Звільнення пам' яті

End.

Масив покажчиків a на дійсні числа розміщується статично та займає фіксоване число байтів (nmax*4=30*4=120). Масив дійсних чисел розміщується у динамічній пам'яті та займає n*8 байтів..

Більшого ефекту в економії пам'яті можна досягнути, якщо використати типізований покажчик на масив дійсних чисел, який розмістимо в динамічній пам'яті за допомогою процедури GetMem.

Приклад 2:

Використання типізованого вказівника на масив:

Program Mas_TP;

Const

nmax = 30;

Type

vect=array [1..nmax] of real;

Var

p: ^vect;

x: real;

i, n, kmin, kmax: byte;

Begin

// Введення n

GetMem(p,n*SizeOf(real)); // Виділення пам'яті

Writeln('Chysla: ');

for i:=l to n do read(p^[i]);

kmin:=l; kmax:=l;

for і:=2 to n do

begin

if p^[kmin]>p^[і] then kmin:=i;

if p^[kmax]<=p^[i] then kmax:=i

end;

x:= p^[kmin];

p^[kmin]:=p^[kmax];

p^[kmax]:=х;

 

for i:=1 to n do write(p^[і]:6:2,' ');

FreeMem(p,n*SizeOf(real));

readln(n)

End.