Witam wszystkich!

Dziś zajmiemy się zmiennymi dynamicznymi w TP. Żeby nie przynudzać zaczynamy.

1. Do czego nam się to przyda?
Dzięki nim będziesz mógł tworzyć bufory ekranu, duże tablice np. 300x400, i gdy będziesz uczył się programować w c++ bez problemu zrozumiesz o co chodzi we wskaźnikach.

2. Jak to się robi?
Wskaźnik jest to taka zmienna, którą możemy używać jak by była inną (jeśli to zrozumieliście to znaczy, że jesteście na prawdę bardzo mądrzy ;))

Deklaracja jej wygląda tak:

var 
wsk:pointer;

Jeszcze raz, prościej. Wskaźnik jest to taka zmienna, którą można porównać z drogowskazem, który pokazuje nam gdzie jest zmienna.
Wykonajcie taki program:

uses crt;
var 
wsk:pointer; 
zmienna:integer;

begin
zmienna:=645;
wsk:=@zmienna;
write(integer(wsk));
readln;
end.

Przeanalizujmy go. 

wsk:pointer; -deklarujemy wskaźnik
...
zmienna:=645; -przypisujemy do zmiennej wartość 645
wsk:=@zmienna; -od tego momentu wsk będzie wskazywał (kierował nas) na zmienna (czyli jakby związaliśmy obie zmienne ze sobą)
write(integer(wsk)); -Zapewne ciekawi was dlaczego nie piszemy po prostu write(wsk). Robimy tak dlatego, bo komputer nie wie jaki typ ma wyświetlić. Możemy także napisać takie coś word(wsk).

Mogło zdziwić was to, że zamiast liczby 645 pojawia nam się 98. Dzieje się tak dlatego, że w wsk mamy wpisany adres zmiennej zmienna a nie jej wartość.
Żeby wyświetlić wartość musimy napisać tak:
write(integer(wsk^));

Zamiast cały czas pisać te typy zmiennych możemy przy deklarowaniu zmiennej wskazać ją na jakiś typ (!).

var 
wsk:^integer; 
zmienna:integer;

begin
zmienna:=645;
wsk:=@zmienna;
write(wsk^); {teraz możemy już pisać bez podawania typu}
readln;
end.

Powtórka:
wsk:pointer -deklaracja zmiennej
wsk:^integer -inna deklaracja zmiennej
wsk:=@zmienna -związanie ze sobą wskaźnika i zmiennej
write(integer(wsk)) -wyświetli adresu zmiennej na, którą wskazuje wsk (przy 1 deklaracji)
write(wsk) -jak wyżej (przy 2 deklaracji)
write(integer(wsk^)) -wyświetli zawartości zmiennej na, którą wskazuje wsk (przy 1 deklaracji)
write(wsk^) -jw (przy 2 deklaracji)

3. Duże tablice
Każda normalnie zadeklarowna zmienna (nazywa się ona statyczna) to pewien obszar w pamięci. TP na każdą zmienną przydziela poniżej 64kb, więc nie możemy na przykład zrobić takiego czegoś:
var
tab:array[0..300,0..300] of byte;

bo 300*300=90000 a 90000 (bajtów) jest oczywiście większe niż 64000 (bajtów) 
(1000 bajtów =1kb)
Żeby rozwiązać ten problem musimy użyć zmiennych dynamicznych.
Teraz zacznijcie uważać ;). Możemy zrobić takie coś:
Var tab:array[0..300] of byte
i takie coś
Type tabt=array[0..300] of byte
więc dlaczego nie moglibyśmy do tablicy tab zamiast byte odwołać się do typu tabt i zrobić takie coś:

Type tabt=array[0..300] of byte;
Var tab:array[0..300] of tabt;
...
i odwoływać się teraz tak:

tab[250][250]:=100;

Powiecie teraz pewnie tak: 
Czemu on się tak cieszy z tego co nam napisał skoro to i tak nie działa? ;)

I tu przydają się zmienne dynamiczne. Robimy po prostu takie coś:

Type tabt=array[0..300] of byte;
Var tab:array[0..300] of ^tabt;
...
i odwoływać się w taki sposób:
tab[250]^[250]:=100;

Ale to nadal nie działa...I tu ujawnia się wyższość zmiennych dynamicznych. Gdy chcemy ich używać musimy je najpierw zadeklarować a później stworzyć, w taki oto sposób:
new(zmienna_dynamiczna)

a jeszcze później usunąć:
dispose(zmienna_dynamiczna)

No. Pokonaliśmy twórców TP ;)