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