Wska╝niki to chyba najtrudniejsza do opanowania cze╢µ
programowania w Delphi. Tak mi siΩ zdaje, bo pamiΩtam jak mi sprawia│o
trudno╢ci opanowanie tego.
Normalnie pisz▒c program i deklaruj▒c zmienne pamiΩµ
dla nich przydzielana jest przy uruchamianiu program. Ty nie musisz siΩ o
nic martwiµ - Delphi sam sobie pamiΩµ dla programu zarezerwuje. Takie
co╢ nazywa siΩ alokacj▒ statyczn▒.
Teraz je┐eli w swoim programie masz du┐o rekord≤w i
zmiennych to przydzia│ statyczny mo┐e byµ niewystarczaj▒cy. W≤wczas
mo┐esz skorzystaµ ze wska╝nik≤w przydzielaj▒c im pamiΩµ
dynamicznie, czyli jawnie. Musisz o to zadbaµ sam... Tak jak m≤wi│em.
Alokuj▒c pamiΩµ statycznie nie mo┐esz korzystaµ z przestrzeni
dyskowej, a tylko z pamiΩci fizycznej. Je┐eli masz w swoim du┐o
tablic, rekord≤w ta pamiΩµ mo┐e byµ niewystarczaj▒ca. Trzeba w≤wczas
dynamicznie zwalniaµ i alokowaµ pamiΩµ. Popatrz na poni┐szy przyk│ad.
procedure TForm1.Button1Click(Sender: TObject);
type
TRec = record // rekord
Imie: String;
Nazwisko: String;
Kod: Integer;
end;
PRec = ^TRec; // wskazanie na rekord "TRec"
var
Rec : PRec; // zmienna na wska╝nik
begin
New(Rec); // przydzia│ pamiΩci
Rec^.Imie := 'Adam'; // wype│nienie rekordu
Rec^.Nazwisko := 'Boduch';
Rec^.Kod := 54150;
Dispose(Rec); // zwolnienie pamiΩci
end;
Pewnie nie po raz pierwszy spotykasz siΩ z tak▒
konstrukcj▒. Nowy typ "PRec" wskazuje na rekord "TRec".
Wskazanie nastΩpuje poprzez znak '^'. NastΩpnie jako zmienna
zadeklarowany zostaje typ "Rec". NastΩpnie przydzia│ pamiΩci
nastΩpuje poprzez polecenie "New". Po tym mo┐na zacz▒µ
wype│nienie rekordu ( tak┐e z wykorzystaniem znaku '^' ). Tak wiΩc
operacja zosta│a wykonana ( na ko±cu nast▒pi│o zwolnienie pamiΩci
).
Tak wiΩc dziΩki wska╝nikom pamiΩµ mo┐e byµ modyfikowana podczas
dzia│ania programu.
Istnieje kilka sposob≤w na alokacjΩ pamiΩci. Mo┐esz
to np. zrobiµ poprzez polecenie "AllocMem":
type
PRec = ^Trec;
Trec = record
S : PCHar;
I : Double;
end;
var
Rec : PRec;
begin
Rec := AllocMem(SizeOf(Trec));
Teraz ┐eby zwolniµ pamiΩµ nale┐y wywo│aµ polecenie:
FreeMem(Rec);
Kolejny spos≤b:
type
PRec = ^Trec;
Trec = record
S : PCHar;
I : Double;
end;
var
Rec : PRec;
begin
GetMem(Rec, SizeOf(TRec));
Przy zwalnianiu tak┐e nale┐y wywo│aµ polecenie "FreeMem".
Przydzia│ dynamiczny ma swoje wady i zalety, ale przy wielkich
tablicach takie zastosowanie jest konieczne.
Adam Boduch