Iako pokazatelji nisu tako važni u Delphi kao što su u C ili C ++, oni su takav "osnovni" alat s kojim se gotovo ništa ne događa programiranje moraju se baviti pokazivačima na neki način.
Iz tog razloga možete pročitati o tome kako je niz ili objekt zapravo samo pokazivač ili da je rukovodilac događaja, kao što je OnClick, zapravo pokazivač na postupak.
Pokazivač na vrstu podataka
Jednostavno rečeno, pokazivač je varijabla koja ima adresu bilo čega u memoriji.
Da bi konkretno definirali ovu definiciju, imajte na umu da je sve što koristi aplikacija pohranjeno negdje u memoriji računala. Budući da pokazivač sadrži adresu druge varijable, kaže se da ukazuje na tu varijablu.
Većinu vremena pokazivači u Delphiju ukazuju na specifičnu vrstu:
var
iValue, j: broj; pIntValue: ^ cijeli broj;
početiiValue: = 2001; pIntValue: = @iValue;... j: = pIntValue ^;
kraj;
sintaksa za deklariranje vrste podataka pokazivača koristi a karet (^). U gornjem kôdu iValue je cjelovita varijabla tipa, a pIntValue je pokazivač cijelog broja. Budući da pokazivač nije ništa više od adrese u memoriji, moramo mu dodijeliti mjesto (adresu) vrijednosti pohranjene u iValue cijeloj varijabli.
@ operator vraća adresu varijable (ili funkciju ili postupak kao što će biti prikazano u nastavku). Ekvivalentno operatoru @ je Addr funkcija. Imajte na umu da vrijednost pIntValue nije 2001.
U ovom primjeru koda pIntValue je tipkani cjelobrojni pokazivač. Dobar stil programiranja je koristiti tipkane pokazivače koliko god možete. Tip podataka Pointera generički je tip pokazivača; predstavlja pokazivač na bilo koje podatke.
Imajte na umu da kada se "^" pojavi nakon varijable pokazivača, de-referencija na pokazivač; to jest, vraća vrijednost pohranjenu na memorijsku adresu koju drži pokazivač. U ovom primjeru, varijabla j ima istu vrijednost kao iValue. Moglo bi izgledati da ovo nema svrhe kada iValue jednostavno možemo dodijeliti j, ali ovaj se dio koda krije iza većine poziva na Win API.
NILing Pokazivači
Nenamjenjeni pokazivači su opasni. Budući da nam pokazatelji omogućuju rad izravno s memorijom računala, ako pokušamo (greškom) napisati na zaštićeno mjesto u memoriji, mogli bismo doći do pogreške kršenja pristupa. To je razlog zašto uvijek trebamo inicijalizirati pokazivač na NIL.
NIL je posebna konstanta koja se može dodijeliti bilo kojem pokazivaču. Kad je nil dodijeljen pokazivaču, pokazivač ne odnosi ništa. Delphi predstavlja, na primjer, prazan dinamički niz ili dugačak niz kao nilski pokazivač.
Pokazivači znakova
Temeljni tipovi PAnsiChar i PWideChar predstavljaju pokazivače na vrijednosti AnsiChar i WideChar. Generički PChar predstavlja pokazivač na Char varijablu.
Ovi pokazivači znakova koriste se za manipuliranje null-terminalom žice. Pomislite na PChar kao na pokazivač na null-terminirani niz ili na niz koji ga predstavlja.
Pokazivači na rekorde
Kad definiramo zapis ili neku drugu vrstu podataka, uobičajena je praksa također definirati pokazivač na tu vrstu. To olakšava manipulaciju primjercima vrste bez kopiranja velikih blokova memorije.
Mogućnost davanja pokazivača za zapise (i nizove) znatno olakšava postavljanje složenih podataka kao povezane popise i stabla.
tip
pNextItem = ^ TLinkedListItem
TLinkedListItem = snimitisName: Gudački; iValue: Integer; NextItem: pNextItem;
kraj;
Ideja iza povezanih lista je dati nam mogućnost da pohranimo adresu do sljedeće povezane stavke na popisu u polju za snimanje NextItem.
Pokazivači na zapise mogu se upotrijebiti, primjerice za pohranu prilagođenih podataka za svaku stavku vlasničkog pregleda.
Proceduralni i metodski pokazatelji
Drugi važan koncept pokazivača u Delfima su pokazivači postupaka i metoda.
Pokazivači koji upućuju na adresu postupka ili funkcije nazivaju se proceduralni pokazivači. Pokazivači metoda slični su pokazivačima postupaka. Međutim, umjesto da ukazuju na samostalne postupke, moraju ukazivati na metode klasa.
Pokazivač metode je pokazivač koji sadrži podatke o imenu i objektu koji se poziva.
Pokazivači i Windows API
Najčešća upotreba pokazivača u Delphiju je povezivanje s kodom C i C ++, što uključuje pristup Windows API-ju.
Windows API funkcije koriste brojne tipove podataka koji Delphi programeru nisu bili poznati. Većina parametara u pozivanju API funkcija su pokazatelji na neki tip podataka. Kao što je gore spomenuto, u Delphiju koristimo nizove s nizom termina u pozivu Windows API funkcija.
U mnogim slučajevima, kada API poziv vrati vrijednost u međuspremniku ili pokazivaču na strukturu podataka, aplikacija mora dodijeliti ove međuspremnike i strukture podataka prije upućivanja API poziva. SHBrowseForFolder Windows API funkcija jedan je primjer.
Dodjela pokazivača i memorije
Prava snaga pokazatelja proizlazi iz sposobnosti izdvajanja memorije dok se program izvršava.
Ovaj dio koda trebao bi biti dovoljan da dokaže da rad s pokazateljima nije tako težak kao što bi se na početku moglo činiti. Koristi se za promjenu teksta (opisa) kontrole s priloženom ručkom.
postupak GetTextFromHandle (hWND: THandle);
var pText: PChar; // pokazivač na char (vidi gore)TextLen: cijeli broj;
početi
{dobiti duljinu teksta}TextLen: = GetWindowTextLength (hWND);
{alocate memory}
GetMem (pText, TextLen); // uzima pokazivač
{preuzmi tekst kontrole}GetWindowText (hWND, pText, TextLen + 1);
{prikaži tekst}ShowMessage (string (pText))
{oslobodi memoriju}FreeMem (pText);
kraj;