Assim como dissemos no post passado que podemos usar os ponteiros para apontar para estruturas, também podemos usar os ponteiros para apontar para matrizes ou vetores. Veja o exemplo abaixo:
{$APPTYPE CONSOLE}
uses SysUtils;
type
PA = ^TA;
TA = array [0..20] of Integer;
var
A: PA;
i: Integer;
begin
New(A);
try
FillChar(A^, SizeOf(TA), 0);
for i := 0 to 15 do
A^[i] := i * i;
for i := 0 to 20 do
WriteLn(Format(‘%d: %d’, [i, A^[i]]));
finally
Dispose(A);
end;
ReadLn;
end.
Muito similar ao ponteiro para uma estrutura, mostrado no post anterior. Observe que o New irá alocar SizeOf(TA) da memória. Isso corresponde a 4 bytes (em compilador de 32 bits) vezes 21 (de 0 à 20), um total de 84 bytes.
Com relação a derreferência automática, o mesmo acontece assim como em ponteiros para estruturas, podemos suprimir o ^, pois o compilador assume que existe uma derreferência quando encontra um [ após um ponteiro, o nosso código pode ser reescrito assim:
{$APPTYPE CONSOLE}
uses SysUtils;
type
PA = ^TA;
TA = array [0..20] of Integer;
var
A: PA;
i: Integer;
begin
New(A);
try
FillChar(A^, SizeOf(TA), 0);
for i := 0 to 15 do
A[i] := i * i;
for i := 0 to 20 do
WriteLn(Format(‘%d: %d’, [i, A[i]]));
finally
Dispose(A);
end;
ReadLn;
end.
No caso de ponteiros para matrizes, aqui encontramos uma grande diferença em relação a linguagem C. No C, todo ponteiro pode ser um vetor, uma notação do tipo:
p = a;
*(p + 0) = 0;
*(p + 1) = 1;
*(p + 2) = 2;
É o mesmo que escrever:
p = a;
p[0] = 0;
p[1] = 1;
p[2] = 2;
No Pascal / Delphi não existe esta paridade entre ponteiros e vetores. Mas existe uma forma de enganar o compilador para definirmos vetores de qualquer tamanho dinamicamente. Incluse isso era muito usado quando não tinhamos as matrizes dinâmicas na linguagem.
Basicamente, para definirmos um vetor de tamanho dinâmico, criamos um estrutura BEM grande e usamos o GetMem ao invés do New, como no exemplo:
{$APPTYPE CONSOLE}
uses SysUtils;
type
PA = ^TA;
TA = array [0..100000] of Integer;
var
A: PA;
i, t: Integer;
begin
t := 16;
GetMem(A, SizeOf(Integer) * t);
try
FillChar(A^, SizeOf(Integer) * t, 0);
for i := 0 to t – 1 do
A[i] := i * i;
for i := 0 to t – 1 do
WriteLn(Format(‘%d: %d’, [i, A[i]]));
finally
FreeMem(A);
end;
ReadLn;
end.
No GetMem definimos o tamanho de memória que queremos utilizar. No caso t vezes o espaço para alocar um inteiro.
0 Respostas para “Ponteiros no Pascal / Delphi – Ponteiros para matrizes / vetores”
Deixe uma Resposta