Porozumění a používání ukazatelů v Delphi

click fraud protection

Přestože ukazatele v něm nejsou tak důležité Delphi jak jsou v C nebo C ++, jsou takovým „základním“ nástrojem, se kterým má téměř cokoli společného programování musí se nějakým způsobem vypořádat s odkazy.

Z tohoto důvodu byste si mohli přečíst o tom, jak je řetězec nebo objekt skutečně jen ukazatelem, nebo že obsluha událostí, jako je OnClick, je vlastně ukazatelem na proceduru.

Ukazatel na typ dat

Jednoduše řečeno, ukazatel je proměnná, která drží adresu všeho v paměti.

Chcete-li konkrétní definici, mějte na paměti, že vše, co aplikace používá, je uloženo někde v paměti počítače. Protože ukazatel drží adresu jiné proměnné, říká se, že odkazuje na tuto proměnnou.

Ukazatele v Delphi většinou odkazují na konkrétní typ:

var
iValue, j: celé číslo; pIntValue: ^ integer;
začít
iValue: = 2001; pIntValue: = @ iValue;... j: = pIntValue ^;
konec
;

syntax pro deklaraci datového typu ukazatel používá a stříška (^). Ve výše uvedeném kódu je iValue proměnnou typu integer a pIntValue je ukazatel typu integer type. Protože ukazatel není nic jiného než adresa v paměti, musíme mu přiřadit umístění (adresu) hodnoty uložené v celočíselné proměnné iValue.

instagram viewer

@ operátor vrátí adresu proměnné (nebo funkci nebo proceduru, jak bude vidět níže). Ekvivalent k operátoru @ je Funkce addr. Hodnota pIntValue není 2001.

V tomto ukázkovém kódu je pIntValue zadaným celočíselným ukazatelem. Dobrým stylem programování je používat zadané ukazatele co nejvíce. Datový typ ukazatele je obecný typ ukazatele; představuje ukazatel na všechna data.

Všimněte si, že když se za proměnnou ukazatele objeví znak „^“, zruší odkaz na ukazatel; to znamená, že vrací hodnotu uloženou na paměťové adrese držené ukazatelem. V tomto příkladu má proměnná j stejnou hodnotu jako iValue. Může to vypadat, že to nemá žádný účel, když můžeme jednoduše přiřadit iValue k j, ale tento kus kódu leží za většinou volání do Win API.

Ukazatele NILing

Nepřiřazené ukazatele jsou nebezpečné. Protože ukazatele umožňují pracovat přímo s pamětí počítače, pokud se pokusíme (omylem) zapsat na chráněné místo v paměti, můžeme získat chybu narušení přístupu. To je důvod, proč bychom měli vždy inicializovat ukazatel na NIL.

NIL je speciální konstanta, kterou lze přiřadit libovolnému ukazateli. Pokud je ukazatel přiřazen nula, ukazatel na nic neodkazuje. Delphi představuje například prázdný dynamické pole nebo dlouhý řetězec jako ukazatel nuly.

Ukazatele znaků

Základní typy PAnsiChar a PWideChar představují ukazatele na hodnoty AnsiChar a WideChar. Obecný PChar představuje ukazatel na proměnnou Char.

Tyto znakové ukazatele se používají k manipulaci s nulovými konci řetězce. Představte si PChar jako ukazatel na řetězec zakončený nulovou hodnotou nebo na pole, které ho představuje.

Ukazatele na záznamy

Když definujeme záznam nebo jiný datový typ, je běžnou praxí také definovat ukazatel na tento typ. To usnadňuje manipulaci s instancemi typu bez kopírování velkých bloků paměti.

Schopnost mít ukazatele na záznamy (a pole) usnadňuje nastavení složitých datových struktur jako propojených seznamů a stromů.

typ
pNextItem = ^ TLinkedListItem
TLinkedListItem = záznamsName: String; iValue: Integer; NextItem: pNextItem;
konec
;

Myšlenkou za propojenými seznamy je poskytnout možnost uložit adresu další propojené položce v seznamu uvnitř pole záznamu NextItem.

Ukazatele na záznamy lze také použít například při ukládání vlastních dat pro každou položku zobrazení stromu.

Ukazatele procedurálních a metodických

Dalším důležitým konceptem ukazatelů v Delphi jsou ukazatele procedur a metod.

Ukazatele, které ukazují na adresu procedury nebo funkce, se nazývají procedurální ukazatele. Ukazatele metod jsou podobné ukazatelům procedur. Namísto poukazování na samostatné postupy však musí ukazovat na metody třídy.

Ukazatel metody je ukazatel, který obsahuje informace o vyvolávaném jménu a objektu.

Ukazatele a rozhraní Windows API

Nejběžnější použití ukazatelů v Delphi je propojení s C a C ++ kódem, který zahrnuje přístup k Windows API.

Okna Funkce API používají řadu typů dat, které mohou být pro programátora Delphi neznámé. Většina parametrů ve volání funkcí API jsou ukazatele na nějaký datový typ. Jak bylo uvedeno výše, při volání funkcí rozhraní Windows API používáme řetězce Delphi s neplatnými řetězci.

V mnoha případech, když volání API vrátí hodnotu ve vyrovnávací paměti nebo ukazateli do datové struktury, musí být tyto vyrovnávací paměti a datové struktury přiděleny aplikací před provedením volání API. Příkladem je funkce rozhraní API rozhraní SHBrowseForFolder Windows.

Ukazatel a přidělení paměti

Skutečná síla ukazatelů vychází ze schopnosti vyčlenit paměť během provádění programu.

Tento kus kódu by měl stačit k prokázání, že práce s ukazateli není tak náročná, jak by se na první pohled mohla zdát. Používá se ke změně textu (titulku) ovládacího prvku s dodanou rukojetí.

postup GetTextFromHandle (hWND: THandle);
var
pText: PChar; // ukazatel na znak (viz výše)TextLen: integer;
začít

{získejte délku textu}
TextLen: = GetWindowTextLength (hWND);
{alocate memory}

GetMem (pText, TextLen); // vezme ukazatel
{získejte text ovládacího prvku}
GetWindowText (hWND, pText, TextLen + 1);
{zobrazit text}
ShowMessage (String (pText))
{uvolněte paměť}
FreeMem (pText);
konec
;
instagram story viewer