Nejdříve úvodem, co je to pointer? Pointer je část paměti, která obsahuje adresu místa jiného výrazu. V Pascalu zpravidla pointer využíváme, chcemeli si uchovat adresu jiné proměnné, ať už normální nebo alokované.
Uchovávat si adresu normální proměnné nemá prakticky velký význam. My se zde budeme zabývat pouze alokovanými proměnnými.
Nejdříve se naučíme pracovat s ukazately. Můžeme je používat jako normální proměnné co se týče přiřazování pointeru pointer. Další operace se nechají provádět jen s ukazateli.
Ukazateli jako takovému můžeme přiřadit adresu nějakého výrazu. Používá se k tomu operátor @. Použití pak vypadá:
{-------------}
var p:pointer;
b:byte;
begin
p:=@b;
end.
{-------------}
Ukazatel nemusí být definován pouze jako Pointer. Můžeme ho definovat rovnou, že ukazuje na nějaký typ pomocí znaku ^.
{-------------}
var p:^byte;
{-------------}
Teď sice umíme do ukazatle proměnnou dostat, ale stále ještě neumíme s ní pracovat. My se na ni musíme odkázata to za pomoci již zmíněného znaku ^.
{-------------}
var p:pointer;
b,c:byte;
begin
b:=1;
p:=@b;
c:=p^;
end.
{-------------}
To nám umožní pracovat s pamětí, na kterou je ukazováno.
Nyní krátká ukázka:
Potřebujeme-li například nějaký textový editor a text bychom si rádi ponechávali v paměti v poli, snažíme se, aby bylo pole co největší. Pole si můžeme vytvořit jako globální, nebo lokální proměnnou, avšak ta se potom vytváří v segmentu alokovaném pro program, kde by se navzájem utlačovaly a došlo by k chybě:"Stack overflow error.". Pak-li ho alokujeme ukazatelem, místo se uvolní kdesi v základní paměti a my pro tuto proměnou můžeme uvlonit až 64kB. Nyní krátká ukázka alokace pole:
{-----------------------------------------------------------}
program alokujpole;
uses crt,dos;
const max=65530;
type tpole=array[1..max] of char;
var ppole:^pole;
begin
write('Pole zatim neni alokovane.');
readkey;
new(ppole);
fillchar(ppole^,max,100);
write('Nyni mame pole plne znaku o decimalni hodnote 100');
readkey;
dispose(ppole);
write('A ted uz zadne pole neni');
end.
{-----------------------------------------------------------}
V programu jsou používány funkce pro uvolnění a znovu navrácení paměti. My sice umíme pracovat s ukazateli, ale nevíme jak pro ně uvolnit paměť. Používáme proto procedury New a Dispose. Každá má za parametr ukazatel, který je definován tak, že ukazuje rovnou na nějaký typ. New paměť přidělí a Dispose ji uvolní.
Ještě jedna důležitá věc je, abychom nezapisovali do paměti, na kterou ukazuje nealokovaný ukazatel. Mohlo by dojít k restartu počítače a nebo nějaké závažné chybě. Proto, nealokovaným ukazatelům přiřazujeme konstantu:
{-----------------------}
var p:pointer;
begin
p:=nil; {Konstanta nil}
end;
{-----------------------}
Pak za pomocí jednoduché podmínky zjistíme, zda je paměť "naše".
16. leden 2008
2 843×
408 slov