Strona g│≤wna

 

Wska╝niki

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▒

Ten symbol oznacza nowe pojΩcieStos to ca│y obszar pamiΩci, kt≤ry rezerwowany jest dla aplikacji w czasie jej uruchamiania.  

 A wiΩc obszar pamiΩci ( Stos ) nie mo┐e byµ w ┐aden spos≤b modyfikowany. Je┐eli piszesz ma│y programik to taka alokacja ( statyczna ) jest wystarczaj▒ca. 

Ten symbol oznacza nowe pojΩcieSterta to ca│a dostΩpna pamiΩµ komputera. + ca│e dostΩpne miejsca na dysku komputera. 

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