Ukazovateľ na ukazovateľ v C++

Ukazovatel Na Ukazovatel V C



Tento článok je o koncepte ukazovateľa na ukazovateľ v C++. Ukazovateľ na ukazovateľ ukazuje alebo ukladá adresu iného ukazovateľa a umožňuje manipuláciu so samotnými ukazovateľmi. Pomocou tohto konceptu môžeme ľahko upraviť ukazovateľ z iného miesta v pamäti. Dvojité ukazovatele sú užitočné v dynamicky alokovanej pamäti alebo viacrozmerných poliach na manipuláciu s prvkami poľa. Budeme diskutovať o tomto ukazovateli na prácu a používanie ukazovateľa v C++ s vhodnými príkladmi.

Scenár 1:  Reprezentácia ukazovateľa na ukazovateľ v pamäti

V tomto scenári je deklarácia dvojitého ukazovateľa podobná deklarácii ukazovateľa s ďalšou hviezdičkou (*) pred názvom ukazovateľa. Pamäťové umiestnenie dvojitého ukazovateľa môžeme jednoducho reprezentovať v C++. Útržok kódu ukazovateľa na ukazovateľ je uvedený v nasledujúcom texte:







#include
pomocou menného priestoru std;
int main ( )
{
int číslica  = päťdesiat ;
int * ptrr;
ptrr = & číslica;
int ** ptrr1;
ptrr1 = & ptrr;
cout << 'Adresa pamäte ukazovateľa je: \n ' ;
cout << 'ptrr (ukazovateľ): ' << ptrr << ' \n ' ;
cout << '*ptrr1 (dvojitý ukazovateľ): ' <<* ptrr1 << ' \n ' ;
cout << ' Hodnota uložená v ukazovateli je: \n ' ;
cout << '*ptrr = ' <<* ptrr << endl;
cout << '**ptrr1 (ukazovateľ na ukazovateľ) = ' <<** ptrr1 << endl;
vrátiť 0 ;
}


Vo funkcii main berieme premennú, ktorej pamäťovú adresu je potrebné uložiť do ukazovateľa. Teraz inicializujeme premennú „digit“. Potom deklarujeme ukazovateľ „ptrr“, ktorý ukladá „číslicovú“ pamäťovú adresu. Teraz deklarujeme dvojitý ukazovateľ, ktorého názov je „**ptrr1“, ktorý ukladá adresu ukazovateľa „*ptrr“. Na konci kódu zobrazíme pamäť a hodnotu ukazovateľa a dvojitého ukazovateľa na obrazovke konzoly. Výstup tohto kódu je uvedený v nasledujúcom texte:




Adresa pamäte ukazovateľa „ptrr“ je „0x6ffe04“ a ukazovateľ „*ptrr1“ tiež ukladá adresu pamäte ukazovateľa „ptrr“. Hodnota, ktorá je uložená vo vnútri ukazovateľa, je „50“. V zásade je adresa dvojitého ukazovateľa vždy rovnaká ako adresa pamäte ukazovateľa.



Scenár 2:  Ukazovateľ na ukazovateľ ako parameter funkcie

V tomto scenári sa naučíme, ako odovzdať dvojitý ukazovateľ v ľubovoľnej funkcii ako parameter na vykonanie dočasnej alokácie pamäte v ľubovoľnej premennej. Útržok kódu parametra funkcie s dvojitým ukazovateľom je uvedený v nasledujúcom texte:





#include
void getMemoryAddress ( int ** double_ptr ) {
ty počasie = 200 ;
* double_ptr = & teplota;
}

int main ( ) {
int * ptr_1;
int ** double_ptr;
double_ptr = & ptr_1;
getMemoryAddress ( double_ptr ) ;
std::cout << 'Hodnota **double_ptr je: ' << ** double_ptr << std::endl;
vrátiť 0 ;
}


Tu sa dozvieme, ako funguje koncept ukazovateľa na ukazovateľ v C++. Pamätajte, že jeden ukazovateľ je v programe deklarovaný na prácu s dvojitým ukazovateľom. Takže vytvoríme funkciu „getMemoryAddress“. Túto funkciu navrhujeme tak, že keď prejdeme parameter, automaticky dostane pamäťovú adresu dvojitého ukazovateľa.

Vo funkcii vezmeme premennú „tempp“ a dvojitý ukazovateľ „**double_ptr“. Dvojitému ukazovateľu odovzdáme adresu zadanej premennej, ktorá je „tempp“ a hodnoty dvojitého ukazovateľa ako argument funkcie. Program zobrazí výsledok kódu hlavnej funkcie na obrazovke konzoly, takže všetky veci, ktoré sú v hlavnej funkcii, sú spustiteľné. V hlavnej funkcii berieme ukazovateľ „ptr_1“ a dvojitý ukazovateľ ako „double_ptr“. Adresu ukazovateľa odovzdáme do dvojitého ukazovateľa.



Teraz odovzdáme premennú dvojitého ukazovateľa vo funkcii override a odovzdáme ukazovateľ na premennú ukazovateľa v príkaze výstupného prúdu „cout“, aby sme ukázali výsledok dvojitého ukazovateľa.

Keď kompilátor dosiahne funkciu override, kontrola kompilátora, kde je táto funkcia definovaná, spustí kód vo funkcii a vráti výsledok do hlavnej funkcie.

Výstup tohto kódu je pripojený v nasledujúcom texte:


Výsledok: Hodnota dvojitého ukazovateľa je 200.

Scenár 3:  Použitie 2D poľa s ukazovateľom na ukazovateľ

V tomto príklade sa budeme zaoberať 2D poľom s dvojitým ukazovateľom. Vezmeme pole a do ukazovateľa odovzdáme adresu poľa. Úplný kód tohto scenára je poskytnutý takto:

int main ( ) {
const int rows = 3 ;
const int cols = 2 ;
int ** matica = new int * [ riadkov ] ;
pre ( int i = 0 ; i < riadky; ++i ) {
matice [ i ] = new int [ stĺpce ] ;
}
pre ( int i = 0 ; i < riadky; ++i ) {
pre ( int j = 0 ; j < stĺpiky; ++j ) {
matice [ i ] [ j ] = i * cols + j;
}
}
pre ( int i = 0 ; i < riadky; ++i ) {
pre ( int j = 0 ; j < stĺpiky; ++j ) {
cout << matice [ i ] [ j ] << '' ;
}
cout << endl;
}
pre ( int i = 0 ; i < riadky; ++i ) {
vymazať [ ] matice [ i ] ;
}
vymazať [ ] matrica;
vrátiť 0 ;
}


Ako všetci vieme, v 2D poli máme veľa riadkov a niekoľko stĺpcov. Vo funkcii main inicializujeme riadky a stĺpce, ktoré majú „const int“. Potom pridelíme pamäťový priestor pre riadky a pamäťový priestor pre stĺpce pozdĺž každého riadku. Hodnotu počtu riadkov odovzdávame ako ukazovateľ v dvojitom ukazovateli matice ako „**matrix“. V tomto dvojitom ukazovateli sa vykoná slučka počtu riadkov alebo true. Potom sa vykoná ďalšia vnútorná slučka, kým sa podmienka nestane falošnou.

Po pridelení pamäte opäť priradíme hodnotu v poli: vonkajšiu slučku pre riadky a vnútornú slučku pre stĺpce 2D poľa. Vo vnútornej slučke sa hodnota riadkov a stĺpcov priradí dvojitému ukazovateľu a vykoná požadovanú aritmetickú operáciu. Zobrazujeme hodnoty 2D poľa, ako je počet riadkov a stĺpcov, ktoré sú alokované v pamäti. Počet riadkov a stĺpcov vždy ukazuje na dvojitý ukazovateľ, ktorý ukladá hodnoty riadkov a stĺpcov. Nakoniec vyčistíme pamäť a uvoľníme toto pole z pamäte v C++.

Výstup 2D poľa s dvojitým ukazovateľom je pripojený nasledovne:

Scenár 4:  Výmena ukazovateľov pomocou ukazovateľa za ukazovateľ

Tu sa naučíme, ako zamieňať ukazovatele v C++ deklarovaním dvojitého ukazovateľa. Útržok kódu tohto scenára je priložený v nasledujúcom texte:

#include
neplatná výmena ( int ** ptrr_1, ty ** ptrr_2 ) {
int * temp_var = * ptrr_1;
* ptrr_1 = * ptrr_2;
* ptrr_2 = temp_var;
}
int main ( ) {
int x = pätnásť , y = 25 ;
int * ptrA = & X, * ptrrB = & a;
std::cout << 'Pred výmenou: *ptrrA je = ' << * ptrA << ', *ptrrB je = ' << * ptrrB << std::endl;
vymeniť ( & ptrA, & ptrrB ) ;
std::cout << 'Po výmene: *ptrrA  je = ' << * ptrA << ', *ptrrB  je = ' << * ptrrB << std::endl;
vrátiť 0 ;
}


Najprv vytvoríme funkciu swap, pričom oba ukazovatele odošleme ako argument funkcie. Vo funkcii swap vezmeme ukazovateľ „temp“ a na nejaký čas prenesieme hodnotu „pointer1“ do „temp“. Potom prejdeme hodnotu „pointer2“ do „pointer1“. Na záver prenesieme hodnotu ukazovateľa „temp“ do ukazovateľa „pointer2“.

V hlavnej funkcii potrebujeme dva ukazovatele, ktoré prejdeme alebo prepíšeme vo funkcii „swap“. Adresy premenných odovzdávame daným ukazovateľom. Potom sa zobrazí hodnota ukazovateľa pred a po výmene ukazovateľa.

Výstup tohto kódu je pripojený v nasledujúcom texte:


Ako vidíme, hodnoty ukazovateľa sa úspešne zamieňajú pomocou dvojitého ukazovateľa v C++.

Záver

Dospeli sme k záveru, že ukazovateľ na ukazovateľ vždy ukladá pamäťovú adresu akéhokoľvek ukazovateľa v C++. Pomocou dvojitého ukazovateľa môžeme kedykoľvek dočasne použiť pamäťové miesto ľubovoľného ukazovateľa. Toto je veľmi efektívny spôsob, ako nepriamo manipulovať s adresou pamäte a pristupovať k údajom.