Pochopenie a používanie ukazovateľov v Delphi

Aj keď ukazovatele nie sú také dôležité Delphi tak, ako sú v C alebo C ++, sú tak „základným“ nástrojom, s ktorým má takmer všetko spoločné programovanie sa musí nejakým spôsobom zaoberať ukazovateľmi.

Z tohto dôvodu by ste si mohli prečítať o tom, ako je reťazec alebo objekt skutočne iba ukazovateľom alebo že obsluha udalostí, ako je napríklad OnClick, je vlastne ukazovateľom postupu.

Ukazovateľ na typ údajov

Jednoducho povedané, ukazovateľ je premenná, ktorá drží adresu čohokoľvek v pamäti.

Ak chcete konkrétne definovať túto definíciu, nezabudnite, že všetko, čo aplikácia používa, je uložené niekde v pamäti počítača. Pretože ukazovateľ drží adresu inej premennej, hovorí sa o nej, aby ukazovala na túto premennú.

Ukazovatele v Delphi väčšinou odkazujú na konkrétny typ:

var
iValue, j: celé číslo; pIntValue: ^ integer;
začať
iValue: = 2001; pIntValue: = @ iValue;... j: = pIntValue ^;
koniec
;

syntax na deklarovanie typu údajov ukazovateľa sa používa a zástupný znak (^). Vo vyššie uvedenom kóde je iValue premennou typu celočíselného typu a pIntValue je ukazovateľ typu celočíselného typu. Pretože ukazovateľ nie je nič iné ako adresa v pamäti, musíme mu priradiť umiestnenie (adresu) hodnoty uloženej v celočíselnej premennej iValue.

instagram viewer

@ operátor vráti adresu premennej (alebo funkciu alebo postup, ako bude vidieť nižšie). Ekvivalent operátora @ je Funkcia addr. Upozorňujeme, že hodnota pIntValue nie je 2001.

V tomto vzorovom kóde je pIntValue zadané celé číslo. Dobrým štýlom programovania je používať zadané ukazovatele čo najviac. Dátový typ ukazovateľa je všeobecný typ ukazovateľa; predstavuje ukazovateľ na akékoľvek údaje.

Všimnite si, že keď sa za premennou ukazovateľa zobrazí znak „^“, zruší odkaz na ukazovateľ; to znamená, že vracia hodnotu uloženú na pamäťovej adrese držanej ukazovateľom. V tomto príklade má premenná j rovnakú hodnotu ako iValue. Môže to vyzerať tak, že to nemá žiadny účel, keď môžeme jValue jednoducho priradiť j, ale tento kus kódu leží za väčšinou volaní do Win API.

Ukazovatele NILing

Nepriradené ukazovatele sú nebezpečné. Keďže ukazovatele umožňujú pracovať priamo s pamäťou počítača, ak sa pokúsime omylom zapísať na chránené miesto v pamäti, mohla by sa vyskytnúť chyba narušenia prístupu. Z tohto dôvodu by sme mali vždy inicializovať ukazovateľ na NIL.

NIL je špeciálna konštanta, ktorú je možné priradiť každému ukazovateľovi. Ak je ukazovateľu priradený nula, ukazovateľ nič neodkazuje. Delphi predstavuje napríklad prázdny dynamické pole alebo dlhý reťazec ako nulový ukazovateľ.

Ukazovatele znakov

Základné typy PAnsiChar a PWideChar predstavujú ukazovatele na hodnoty AnsiChar a WideChar. Generický PChar predstavuje ukazovateľ na Char premennú.

Tieto znakové ukazovatele sa používajú na manipuláciu s nulovými ukončeniami reťazce. Považujte PChar za ukazovateľ na reťazec ukončený nulovou hodnotou alebo na pole, ktoré ho predstavuje.

Ukazovatele na záznamy

Keď definujeme záznam alebo iný typ údajov, je bežnou praxou tiež definovať ukazovateľ na tento typ. To uľahčuje manipuláciu s inštanciami typu bez kopírovania veľkých blokov pamäte.

Schopnosť mať ukazovatele na záznamy (a polia) uľahčuje nastavenie zložitých dátových štruktúr ako prepojených zoznamov a stromov.

typ
pNextItem = ^ TLinkedListItem
TLinkedListItem = rekordsName: String; iValue: Celé číslo; NextItem: pNextItem;
koniec
;

Myšlienka za prepojenými zoznamami je poskytnúť nám možnosť uložiť adresu nasledujúcej prepojenej položky v zozname vo vnútri poľa záznamu NextItem.

Ukazovatele na záznamy sa môžu tiež použiť napríklad pri ukladaní vlastných údajov pre každú položku stromového prehľadu.

Ukazovatele postupu a metódy

Ďalším dôležitým konceptom ukazovateľov v Delphi sú ukazovatele postupov a metód.

Ukazovatele, ktoré ukazujú na adresu postupu alebo funkcie, sa nazývajú procedurálne ukazovatele. Ukazovatele metódy sú podobné ukazovateľom postupu. Namiesto poukazovania na samostatné postupy však musia ukazovať na metódy triedy.

Ukazovateľ metódy je ukazovateľ, ktorý obsahuje informácie o vyvolanom názve a objekte.

Ukazovatele a rozhranie API systému Windows

Najbežnejším využitím ukazovateľov v Delphi je prepojenie s kódmi C a C ++, ktoré zahŕňajú prístup k rozhraniu Windows API.

windows Funkcie API používajú množstvo typov údajov, ktoré môžu byť pre programátora Delphi neznáme. Väčšina parametrov vo volaní funkcií API sú ukazovatele na určitý typ údajov. Ako je uvedené vyššie, pri volaní funkcií rozhrania Windows API používame v Delphi reťazce ukončené nulovou hodnotou.

V mnohých prípadoch, keď volanie API vráti hodnotu vo vyrovnávacej pamäti alebo ukazovateli do dátovej štruktúry, tieto vyrovnávacie pamäte a dátové štruktúry musia byť pridelené aplikáciou pred uskutočnením volania API. Jedným z príkladov je funkcia Windows API rozhrania SHBrowseForFolder.

Ukazovateľ a pridelenie pamäte

Skutočná sila ukazovateľov vychádza zo schopnosti vyčleniť pamäť počas vykonávania programu.

Tento kus kódu by mal stačiť na preukázanie, že práca s ukazovateľmi nie je taká náročná, ako by sa mohla na prvý pohľad zdať. Používa sa na zmenu textu (titulku) ovládacieho prvku pomocou dodanej rukoväte.

procedúra GetTextFromHandle (hWND: THandle);
var
pText: PChar; // ukazovateľ na znak (pozri vyššie)TextLen: celé číslo;
začať

{získajte dĺžku textu}
TextLen: = GetWindowTextLength (hWND);
{alocate memory}

GetMem (pText, TextLen); // vezme ukazovateľ
{získajte text ovládacieho prvku}
GetWindowText (hWND, pText, TextLen + 1);
{zobraziť text}
ShowMessage (String (pText))
{uvoľnite pamäť}
FreeMem (pText);
koniec
;
instagram story viewer