C – ukazatel na ukazatel (dvojitý ukazatel)

Předpoklad: Ukazatele v C

Ukazatel na ukazatel v C se používá, když chceme uložit adresu jiného ukazatele. První ukazatel slouží k uložení adresy proměnné. A druhý ukazatel se používá k uložení adresy prvního ukazatele. Proto jsou také známé jako dvojité ukazatele . Můžeme použít ukazatel na ukazatel ke změně hodnot normálních ukazatelů nebo vytvořit 2D pole s proměnlivou velikostí. Dvojitý ukazatel zabírá stejné množství místa v zásobníku paměti jako normální ukazatel.

Deklarace ukazatele na ukazatel v C

Deklarování ukazatele na ukazatel je podobné jako deklarování ukazatele v C. Rozdíl je v tom, že před název ukazatele musíme umístit další 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. 

Výše uvedený diagram ukazuje paměťovou reprezentaci ukazatele na ukazatel. První ukazatel ptr1 ukládá adresu proměnné a druhý ukazatel ptr2 ukládá adresu prvního ukazatele.

Příklad dvojitého ukazatele 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ýstup

Value of var = 789 Value of var using single pointer = 789 Value of var using double pointer = 789 

Jak funguje dvojitý ukazatel?

Fungování dvojitého ukazatele lze vysvětlit pomocí obrázku výše:

  • Dvojitý ukazatel je deklarován pomocí syntaxe uvedené výše.
  • Poté uložíme adresu dalšího ukazatele jako hodnotu tohoto nového dvojitého ukazatele.
  • Nyní, pokud chceme manipulovat nebo dereferencovat kteroukoli z jeho úrovní, musíme použít operátor Hvězdička ( * ), kolikrát se chceme dostat dolů na úroveň.

Velikost ukazatele na ukazatel v C

V programovacím jazyce C se dvojitý ukazatel chová podobně jako normální ukazatel v C. Velikost proměnné s dvojitým ukazatelem je tedy vždy rovna normálním ukazatelům. Můžeme to ověřit pomocí níže uvedeného programu C.

Příklad 1: C Program pro zjištění velikosti ukazatele na ukazatel.

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ýstup

 Size of normal Pointer: 8 Size of Double Pointer: 8 

Poznámka: Výstup výše uvedeného kódu také závisí na typu používaného stroje. Velikost ukazatele není v programovacím jazyce C pevná a závisí na dalších faktorech, jako je architektura CPU a použitý OS. Obvykle bude pro 64bitový operační systém velikost 8 bajtů a pro 32bitový operační systém bude velikost 4 bajty.

Aplikace dvojitých ukazatelů v C

Níže jsou uvedena hlavní použití ukazatele na ukazatele v C:

  • Používají se při dynamické alokaci paměti vícerozměrných polí.
  • Lze je použít k ukládání víceúrovňových dat, jako je odstavec textového dokumentu, věty a sémantika slova.
  • Používají se v datových strukturách k přímé manipulaci s adresami uzlů bez kopírování.
  • Mohou být použity jako argumenty funkce pro manipulaci s adresou uloženou v místním ukazateli.

Víceúrovňové ukazatele v C

Dvojité ukazatele nejsou jedinými víceúrovňovými ukazateli podporovanými jazykem C. Co když chceme změnit hodnotu dvojitého ukazatele?

V tomto případě můžeme použít trojitý ukazatel, což bude ukazatel na ukazatel na ukazatel, tj. int ***t_ptr.

Syntaxe trojitého ukazatele

  pointer_type *** pointer_name; 

Podobně pro změnu hodnoty trojitého ukazatele můžeme použít ukazatel na ukazatel na ukazatel na ukazatel (čtyřúrovňový ukazatel). Jinými slovy, můžeme říci, že ke změně hodnoty proměnné úroveň – x můžeme použít ukazatel úroveň – x+1. A tento koncept lze dále rozšířit.

Poznámka : Můžeme použít jakýkoli ukazatel úrovně v C. Neexistují žádná omezení, ale program je díky tomu velmi složitý a náchylný k chybám.

Musíš číst - Funkční ukazatel v C