C – Ukazovateľ na ukazovateľ (Dvojitý ukazovateľ)
Predpoklad: Ukazovatele v C
Ukazovateľ na ukazovateľ v C sa používa, keď chceme uložiť adresu iného ukazovateľa. Prvý ukazovateľ slúži na uloženie adresy premennej. A druhý ukazovateľ sa používa na uloženie adresy prvého ukazovateľa. Preto sú známe aj ako dvojité ukazovatele . Ukazovateľ na ukazovateľ môžeme použiť na zmenu hodnôt normálnych ukazovateľov alebo na vytvorenie 2-D poľa s premenlivou veľkosťou. Dvojitý ukazovateľ zaberá rovnaké množstvo miesta v zásobníku pamäte ako normálny ukazovateľ.
Deklarácia ukazovateľa na ukazovateľ v C
Deklarovanie ukazovateľa na ukazovateľ je podobné ako deklarovanie ukazovateľa v jazyku C. Rozdiel je v tom, že pred názov ukazovateľa musíme umiestniť ďalší znak „*“.
data_type_of_pointer **name_of_variable = & normal_pointer_variable;
int val = 5; int *ptr = &val; // storing address of val to pointer ptr. int **d_ptr = &ptr; // pointer to a pointer declared // which is pointing to an integer.
Vyššie uvedený diagram ukazuje pamäťovú reprezentáciu ukazovateľa na ukazovateľ. Prvý ukazovateľ ptr1 ukladá adresu premennej a druhý ukazovateľ ptr2 ukladá adresu prvého ukazovateľa.
Príklad dvojitého ukazovateľa v C
C
// C program to demonstrate pointer to pointer> #include> int> main()> {> > int> var = 789;> > // pointer for var> > int> * ptr2;> > // double pointer for ptr2> > int> ** ptr1;> > // storing address of var in ptr2> > ptr2 = &var;> > // Storing address of ptr2 in ptr1> > ptr1 = &ptr2;> > // Displaying value of var using> > // both single and double pointers> > printf> (> 'Value of var = %d
'> , var);> > printf> (> 'Value of var using single pointer = %d
'> , *ptr2);> > printf> (> 'Value of var using double pointer = %d
'> , **ptr1);> > return> 0;> }> |
Výkon
Value of var = 789 Value of var using single pointer = 789 Value of var using double pointer = 789
Ako funguje dvojitý ukazovateľ?
Fungovanie dvojitého ukazovateľa možno vysvetliť pomocou vyššie uvedeného obrázka:
- Dvojitý ukazovateľ je deklarovaný pomocou syntaxe uvedenej vyššie.
- Potom uložíme adresu ďalšieho ukazovateľa ako hodnotu tohto nového dvojitého ukazovateľa.
- Teraz, ak chceme manipulovať alebo dereferencovať niektorú z jej úrovní, musíme použiť operátor hviezdička ( * ), koľkokrát nižšie úroveň, o ktorú chceme ísť.
Veľkosť ukazovateľa na ukazovateľ v C
V programovacom jazyku C sa dvojitý ukazovateľ správa podobne ako normálny ukazovateľ v C. Veľkosť premennej s dvojitým ukazovateľom sa teda vždy rovná normálnym ukazovateľom. Môžeme to overiť pomocou nižšie uvedeného programu C.
Príklad 1: C Program na zistenie veľkosti ukazovateľa na ukazovateľ.
C
// C program to find the size of pointer to pointer> #include> int> main()> {> > // defining single and double pointers> > int> a = 5;> > int> * ptr = &a;> > int> ** d_ptr = &ptr;> > // size of single pointer> > printf> (> ' Size of normal Pointer: %d
'> ,> sizeof> (ptr));> > // size of double pointer> > printf> (> ' Size of Double Pointer: %d
'> ,> sizeof> (d_ptr));> > return> 0;> }> |
Výkon
Size of normal Pointer: 8 Size of Double Pointer: 8
Poznámka: Výstup vyššie uvedeného kódu závisí aj od typu stroja, ktorý sa používa. Veľkosť ukazovateľa nie je v programovacom jazyku C pevná a závisí od iných faktorov, ako je architektúra CPU a použitý OS. Pre 64-bitový operačný systém bude veľkosť zvyčajne 8 bajtov a pre 32-bitový operačný systém bude veľkosť 4 bajty.
Aplikácia dvojitých ukazovateľov v C
Nižšie sú uvedené hlavné použitia ukazovateľa na ukazovatele v jazyku C:
- Používajú sa pri dynamickom prideľovaní pamäte viacrozmerných polí.
- Môžu sa použiť na ukladanie viacúrovňových údajov, ako je odsek textového dokumentu, vety a sémantika slov.
- Používajú sa v dátových štruktúrach na priamu manipuláciu s adresami uzlov bez kopírovania.
- Môžu byť použité ako funkčné argumenty na manipuláciu s adresou uloženou v lokálnom ukazovateli.
Viacúrovňové ukazovatele v C
Dvojité ukazovatele nie sú jediné viacúrovňové ukazovatele podporované jazykom C. Čo ak chceme zmeniť hodnotu dvojitého ukazovateľa?
V tomto prípade môžeme použiť trojitý ukazovateľ, ktorý bude ukazovateľom na ukazovateľ na ukazovateľ, tj int ***t_ptr.
Syntax trojitého ukazovateľa
pointer_type *** pointer_name;
Podobne na zmenu hodnoty trojitého ukazovateľa môžeme použiť ukazovateľ na ukazovateľ na ukazovateľ na ukazovateľ (štyriúrovňový ukazovateľ). Inými slovami, môžeme povedať, že na zmenu hodnoty premennej úroveň – x môžeme použiť ukazovateľ úroveň – x+1. A tento koncept možno ďalej rozširovať.
Poznámka : Môžeme použiť akýkoľvek ukazovateľ úrovne v C. Neexistujú žiadne obmedzenia, ale program je veľmi zložitý a náchylný na chyby.
Musíte prečítať - Ukazovateľ funkcie v C