Pokazivač na pokazivač u C++

Pokazivac Na Pokazivac U C



Ovaj članak govori o konceptu pokazivača na pokazivač u C++. Pokazivač na pokazivač pokazuje ili pohranjuje adresu drugog pokazivača i omogućuje manipulaciju samih pokazivača. Koristeći ovaj koncept, možemo jednostavno modificirati pokazivač s drugog mjesta u memoriji. Dvostruki pokazivači korisni su u dinamički dodijeljenoj memoriji ili višedimenzionalnim nizovima za manipuliranje elementima niza. Razgovarat ćemo o radu i upotrebi pokazivača na pokazivač u C++ s odgovarajućim primjerima.

Scenarij 1:  Memorijska prezentacija pokazivača na pokazivač

U ovom scenariju, deklariranje dvostrukog pokazivača slično je deklaraciji pokazivača s dodatnom zvjezdicom (*) ispred naziva pokazivača. Lako možemo prikazati memorijsku lokaciju dvostrukog pokazivača u C++. Isječak koda pokazivača na pokazivač dan je u nastavku:







#include
korištenje imenskog prostora std;
int glavni ( )
{
int znamenka  = pedeset ;
int * ptrr;
ptrr = i broj;
int ** ptrr1;
ptrr1 = i ptrr;
cout << 'Memorijska adresa pokazivača je: \n ' ;
cout << 'ptrr (pokazivač): ' << ptrr << ' \n ' ;
cout << '*ptrr1 (dvostruki pokazivač): ' <<* ptrr1 << ' \n ' ;
cout << ' Vrijednost pohranjena u pokazivaču je: \n ' ;
cout << '*ptrr = ' <<* ptrr << endl;
cout << '**ptrr1 (pokazivač na pokazivač) = ' <<** ptrr1 << endl;
povratak 0 ;
}


U glavnoj funkciji uzimamo varijablu čiju memorijsku adresu treba pohraniti u pokazivač. Sada inicijaliziramo varijablu 'digit'. Nakon toga deklariramo pokazivač “ptrr” koji pohranjuje memorijsku adresu “cifre”. Sada deklariramo dvostruki pokazivač čije je ime “**ptrr1” koji pohranjuje adresu pokazivača “*ptrr”. Na kraju koda prikazujemo memoriju i vrijednost pokazivača i dvostrukog pokazivača na ekranu konzole. Izlaz ovog koda je spomenut u sljedećem:




Memorijska adresa pokazivača “ptrr” je “0x6ffe04”, a pokazivač “*ptrr1” također pohranjuje memorijsku adresu pokazivača “ptrr”. Vrijednost koja je pohranjena unutar pokazivača je “50”. U osnovi, adresa dvostrukog pokazivača uvijek je ista kao memorijska adresa pokazivača.



Scenarij 2:  Pokazivač na pokazivač kao parametar funkcije

U ovom scenariju naučit ćemo kako prenijeti dvostruki pokazivač u bilo koju funkciju kao parametar za izvođenje privremene dodjele memorije u bilo kojoj varijabli. Isječak koda parametra funkcije s dvostrukim pokazivačem spominje se u sljedećem:





#include
void getMemoryAddress ( int ** dvostruko_ptr ) {
ti vrijeme = 200 ;
* dvostruko_ptr = i temp;
}

int glavni ( ) {
int * ptr_1;
int ** dvostruko_ptr;
dvostruko_ptr = i ptr_1;
getMemoryAddress ( dvostruko_ptr ) ;
std::cout << 'Vrijednost **double_ptr je: ' << ** dvostruko_ptr << std::endl;
povratak 0 ;
}


Ovdje ćemo naučiti kako koncept pokazivača na pokazivač funkcionira u C++. Zapamtite da je jedan pokazivač deklariran u programu za rad s dvostrukim pokazivačem. Dakle, gradimo funkciju 'getMemoryAddress'. Dizajnirali smo ovu funkciju tako da kada proslijedimo parametar, ona automatski dobije memorijsku adresu dvostrukog pokazivača.

U funkciji uzimamo varijablu “tempp” i dvostruki pokazivač “**double_ptr”. Adresu navedene varijable koja je 'tempp' prosljeđujemo dvostrukom pokazivaču i vrijednosti dvostrukog pokazivača kao argument funkcije. Program prikazuje rezultat koda glavne funkcije na zaslonu konzole, tako da su sve stvari koje se nalaze u glavnoj funkciji izvršne. Uzimamo pokazivač “ptr_1” i dvostruki pokazivač kao “double_ptr” u glavnoj funkciji. Adresu pokazivača prosljeđujemo dvostrukom pokazivaču.



Sada prosljeđujemo varijablu dvostrukog pokazivača u funkciji nadjačavanja i prosljeđujemo pokazivač na varijablu pokazivača u naredbi izlaznog toka 'cout' kako bismo prikazali rezultat dvostrukog pokazivača.

Kada prevodilac dođe do funkcije nadjačavanja, alat za provjeru prevoditelja gdje je ova funkcija definirana izvršava kod unutar funkcije i vraća rezultat glavnoj funkciji.

Izlaz ovog koda je priložen u sljedećem:


Rezultat: Vrijednost dvostrukog pokazivača je 200.

Scenarij 3:  Korištenje 2D niza s pokazivačem na pokazivač

U ovom primjeru bavit ćemo se 2D nizom koji ima dvostruki pokazivač. Uzimamo niz i prosljeđujemo adresu niza u pokazivaču. Potpuni kod ovog scenarija dan je kako slijedi:

int glavni ( ) {
const int redaka = 3 ;
const int cols = 2 ;
int ** matrica = novi int * [ redaka ] ;
za ( int i = 0 ; ja < redovi; ++i ) {
matrica [ ja ] = novi int [ cols ] ;
}
za ( int i = 0 ; ja < redovi; ++i ) {
za ( int j = 0 ; j < stupci; ++j ) {
matrica [ ja ] [ j ] = i * stupci + j;
}
}
za ( int i = 0 ; ja < redovi; ++i ) {
za ( int j = 0 ; j < stupci; ++j ) {
cout << matrica [ ja ] [ j ] << ' ' ;
}
cout << endl;
}
za ( int i = 0 ; ja < redovi; ++i ) {
izbrisati [ ] matrica [ ja ] ;
}
izbrisati [ ] matrica;
povratak 0 ;
}


Kao što svi znamo, imamo mnogo redaka i nekoliko stupaca u 2D nizu. U glavnoj funkciji inicijaliziramo retke i stupce koji imaju 'const int'. Nakon toga alociramo memorijski prostor za retke i memorijski prostor za stupce duž svakog retka. Prosljeđujemo vrijednost broja redaka kao pokazivač u dvostrukom pokazivaču matrice kao “**matrica”. U ovom dvostrukom pokazivaču, petlja broja redaka je izvršena ili istinita. Zatim se izvršava još jedna unutarnja petlja sve dok uvjet ne postane lažan.

Nakon dodjele memorije, ponovno dodjeljujemo vrijednost u nizu: vanjsku petlju za retke i unutarnju petlju za stupce 2D niza. U unutarnjoj petlji, vrijednost redaka i stupaca dodjeljuje se dvostrukom pokazivaču i izvodi potrebnu aritmetičku operaciju. Prikazujemo vrijednosti 2D niza poput broja redaka i stupaca koji su dodijeljeni u memoriji. Broj redaka i stupaca uvijek pokazuje na dvostruki pokazivač koji pohranjuje vrijednosti redaka i stupaca. Na kraju, čistimo memoriju i oslobađamo ovaj niz iz memorije u C++.

Izlaz 2D niza s dvostrukim pokazivačem priložen je u sljedećem:

Scenarij 4:  Zamjena pokazivača pomoću pokazivača na pokazivač

Ovdje ćemo naučiti kako zamijeniti pokazivače u C++ deklaracijom dvostrukog pokazivača. Isječak koda ovog scenarija priložen je u nastavku:

#include
void swap ( int ** ptrr_1, ti ** ptrr_2 ) {
int * temp_var = * ptrr_1;
* ptrr_1 = * ptrr_2;
* ptrr_2 = temp_var;
}
int glavni ( ) {
int x = petnaest , y = 25 ;
int * ptrrA = i x, * ptrrB = i i;
std::cout << 'Prije zamjene: *ptrrA je = ' << * ptrrA << ', *ptrrB je = ' << * ptrrB << std::endl;
zamijeniti ( i ptrrA, i ptrrB ) ;
std::cout << 'Nakon zamjene: *ptrrA  je = ' << * ptrrA << ', *ptrrB  je= ' << * ptrrB << std::endl;
povratak 0 ;
}


Prvo gradimo funkciju swap, prosljeđujući oba pokazivača kao argument funkcije. U funkciji swap uzimamo pokazivač 'temp' i neko vrijeme prosljeđujemo vrijednost 'pointer1' u 'temp'. Zatim prosljeđujemo vrijednost “pointer2” u “pointer1”. Na kraju prosljeđujemo vrijednost pokazivača “temp” na “pointer2”.

U glavnoj funkciji potrebna su nam dva pokazivača koja prosljeđujemo ili nadjačavamo u funkciji “swap”. Zadanim pokazivačima prosljeđujemo adrese varijabli. Zatim se prikazuje vrijednost pokazivača prije i nakon zamjene pokazivača.

Izlaz ovog koda je priložen u sljedećem:


Kao što vidimo, vrijednosti pokazivača se uspješno mijenjaju korištenjem dvostrukog pokazivača u C++.

Zaključak

Zaključili smo da pokazivač na pokazivač uvijek pohranjuje memorijsku adresu bilo kojeg pokazivača u C++. Dvostruki pokazivač možemo koristiti za privremeno korištenje memorijske lokacije bilo kojeg pokazivača u bilo kojem trenutku. Ovo je vrlo učinkovit način za neizravno manipuliranje memorijskom adresom i pristup podacima.