Wskaźnik do wskaźnika w C++

Wskaznik Do Wskaznika W C



Ten artykuł dotyczy koncepcji wskaźnika do wskaźnika w C++. Wskaźnik do wskaźnika wskazuje lub przechowuje adres innego wskaźnika i umożliwia manipulowanie samymi wskaźnikami. Korzystając z tej koncepcji, możemy łatwo zmodyfikować wskaźnik z innego miejsca w pamięci. Podwójne wskaźniki są przydatne w dynamicznie przydzielanej pamięci lub tablicach wielowymiarowych do manipulowania elementami tablicy. Omówimy działanie i użycie wskaźnika do wskaźnika w C++ na odpowiednich przykładach.

Scenariusz 1: Reprezentacja wskaźnika w pamięci

W tym scenariuszu deklaracja podwójnego wskaźnika jest podobna do deklaracji wskaźnika z dodatkową gwiazdką (*) przed nazwą wskaźnika. Możemy łatwo przedstawić lokalizację pamięci podwójnego wskaźnika w C++. Fragment kodu wskaźnika do wskaźnika przedstawiono poniżej:







#include
używając przestrzeni nazw std;
int główny ( )
{
cyfra int  = pięćdziesiąt ;
wew * ptrr;
ptrr = & cyfra;
wew ** ptrr1;
ptrr1 = & ptrr;
cout << „Adres pamięci wskaźnika to: \N ' ;
cout << 'ptrr (wskaźnik): ' << ptrr << ' \N ' ;
cout << '*ptrr1 (podwójny wskaźnik): ' <<* ptrr1 << ' \N ' ;
cout << 'Wartość przechowywana we wskaźniku to: \N ' ;
cout << '*ptrr = ' <<* ptrr << koniec;
cout << '**ptrr1 (wskaźnik do wskaźnika) = ' <<** ptrr1 << koniec;
powrót 0 ;
}


W funkcji main bierzemy zmienną, której adres pamięci należy zapisać we wskaźniku. Teraz inicjujemy zmienną „cyfra”. Następnie deklarujemy wskaźnik „ptrr”, który przechowuje „cyfrowy” adres pamięci. Teraz deklarujemy podwójny wskaźnik o nazwie „**ptrr1”, który przechowuje adres wskaźnika „*ptrr”. Na końcu kodu wyświetlamy na ekranie konsoli pamięć oraz wartość wskaźnika i podwójnego wskaźnika. Dane wyjściowe tego kodu są wymienione poniżej:




Adres pamięci wskaźnika „ptrr” to „0x6ffe04”, a wskaźnik „*ptrr1” przechowuje także adres pamięci wskaźnika „ptrr”. Wartość przechowywana wewnątrz wskaźnika to „50”. Zasadniczo adres podwójnego wskaźnika jest zawsze taki sam, jak adres pamięci wskaźnika.



Scenariusz 2:  Wskaźnik na wskaźnik jako parametr funkcji

W tym scenariuszu dowiemy się, jak przekazać podwójny wskaźnik w dowolnej funkcji jako parametr, aby wykonać tymczasową alokację pamięci w dowolnej zmiennej. Fragment kodu parametru funkcji z podwójnym wskaźnikiem jest wspomniany poniżej:





#include
unieważnij adres pamięci ( wew ** double_ptr ) {
Twoja pogoda = 200 ;
* double_ptr = & temperatura;
}

int główny ( ) {
wew * ptr_1;
wew ** double_ptr;
double_ptr = & ptr_1;
pobierz adres pamięci ( double_ptr ) ;
std::cout << „Wartość **double_ptr wynosi: „ << ** double_ptr << std::endl;
powrót 0 ;
}


Tutaj dowiemy się, jak działa koncepcja wskaźnika do wskaźnika w C++. Pamiętaj, że w programie zadeklarowano jeden wskaźnik do pracy ze wskaźnikiem podwójnym. Dlatego budujemy funkcję „getMemoryAddress”. Projektujemy tę funkcję tak, aby po przekazaniu parametru automatycznie pobierała adres pamięci podwójnego wskaźnika.

W funkcji bierzemy zmienną „tempp” i podwójny wskaźnik „**double_ptr”. Do podwójnego wskaźnika przekazujemy adres określonej zmiennej jaką jest „tempp” i wartości podwójnego wskaźnika jako argument funkcji. Program wyświetla wynik kodu funkcji głównej na ekranie konsoli, więc wszystkie elementy znajdujące się w funkcji głównej są wykonywalne. W funkcji głównej przyjmujemy wskaźnik „ptr_1” i wskaźnik podwójny jako „double_ptr”. Przekazujemy adres wskaźnika do podwójnego wskaźnika.



Teraz przekazujemy zmienną podwójnego wskaźnika w funkcji override i przekazujemy wskaźnik do zmiennej wskaźnikowej w instrukcji strumienia wyjściowego „cout”, aby pokazać wynik podwójnego wskaźnika.

Gdy kompilator osiągnie funkcję przesłaniania, moduł sprawdzający kompilator, w którym zdefiniowano tę funkcję, wykonuje kod wewnątrz funkcji i zwraca wynik do funkcji głównej.

Dane wyjściowe tego kodu są załączone w następujący sposób:


Wynik: wartość podwójnego wskaźnika wynosi 200.

Scenariusz 3: Korzystanie z tablicy 2D ze wskaźnikiem do wskaźnika

W tym przykładzie będziemy mieli do czynienia z tablicą 2D posiadającą podwójny wskaźnik. Bierzemy tablicę i przekazujemy adres tablicy we wskaźniku. Pełny kod tego scenariusza przedstawiono w następujący sposób:

int główny ( ) {
stała w wierszach = 3 ;
const int cols = 2 ;
wew ** macierz = nowa int * [ wydziwianie ] ;
Do ( int ja = 0 ; I < wydziwianie; ++ja ) {
matryca [ I ] = nowy wew [ kol ] ;
}
Do ( int ja = 0 ; I < wydziwianie; ++ja ) {
Do ( int j = 0 ; J < kolumny; ++j ) {
matryca [ I ] [ J ] = ja * kol + j;
}
}
Do ( int ja = 0 ; I < wydziwianie; ++ja ) {
Do ( int j = 0 ; J < kolumny; ++j ) {
cout << matryca [ I ] [ J ] << ' ' ;
}
cout << koniec;
}
Do ( int ja = 0 ; I < wydziwianie; ++ja ) {
usuwać [ ] matryca [ I ] ;
}
usuwać [ ] matryca;
powrót 0 ;
}


Jak wszyscy wiemy, w tablicy 2D mamy wiele wierszy i kilka kolumn. W funkcji main inicjujemy wiersze i kolumny, które mają „const int”. Następnie przydzielamy przestrzeń pamięci dla wierszy i przestrzeń pamięci dla kolumn w każdym wierszu. Wartość liczby wierszy przekazujemy jako wskaźnik w podwójnym wskaźniku macierzy jako „**macierz”. W tym podwójnym wskaźniku wykonywana jest pętla liczby wierszy lub wartość true. Następnie wykonywana jest kolejna pętla wewnętrzna, aż warunek zmieni się na fałszywy.

Po przydzieleniu pamięci ponownie przypisujemy wartość w tablicy: zewnętrzną pętlę dla wierszy i wewnętrzną pętlę dla kolumn tablicy 2D. W wewnętrznej pętli wartość wierszy i kolumn jest przypisywana do podwójnego wskaźnika i wykonuje wymaganą operację arytmetyczną. Wyświetlamy wartości tablicy 2D, takie jak liczba wierszy i kolumn przydzielonych w pamięci. Liczba wierszy i kolumn zawsze wskazuje podwójny wskaźnik przechowujący wartości wierszy i kolumn. Na koniec czyścimy pamięć i zwalniamy tę tablicę z pamięci w C++.

Dane wyjściowe tablicy 2D z podwójnym wskaźnikiem załączono w następujący sposób:

Scenariusz 4: Zamiana wskaźników za pomocą wskaźnika na wskaźnik

Tutaj dowiemy się, jak zamieniać wskaźniki w C++, deklarując podwójny wskaźnik. Fragment kodu tego scenariusza znajduje się w załączniku poniżej:

#include
nieważna zamiana ( wew ** ptrr_1, ty ** ptrr_2 ) {
wew * temp_var = * ptrr_1;
* ptrr_1 = * ptrr_2;
* ptrr_2 = temp_var;
}
int główny ( ) {
int x = piętnaście , y = 25 ;
wew * ptrrA = & X, * ptrrB = & I;
std::cout << „Przed zamianą: *ptrrA is =” << * ptrrA << ', *ptrrB to = ' << * ptrrB << std::endl;
zamieniać ( & ptrrA, & ptrrB ) ;
std::cout << „Po zamianie: *ptrrA  is = „ << * ptrrA << ', *ptrrB  jest= ' << * ptrrB << std::endl;
powrót 0 ;
}


Najpierw budujemy funkcję zamiany, przekazując oba wskaźniki jako argument funkcji. W funkcji swap bierzemy wskaźnik „temp” i przekazujemy na jakiś czas wartość „wskaźnik1” do „temp”. Następnie przekazujemy wartość „wskaźnik2” do „wskaźnik1”. Na koniec przekazujemy wartość wskaźnika „temp” do „wskaźnika2”.

W funkcji main potrzebujemy dwóch wskaźników, które przekazujemy lub nadpisujemy w funkcji „zamień”. Do podanych wskaźników przekazujemy adresy zmiennych. Następnie wyświetlana jest wartość wskaźnika przed i po zamianie wskaźnika.

Dane wyjściowe tego kodu są załączone w następujący sposób:


Jak widzimy, wartości wskaźnika są pomyślnie zamieniane przy użyciu podwójnego wskaźnika w C++.

Wniosek

Doszliśmy do wniosku, że wskaźnik do wskaźnika zawsze przechowuje adres pamięci dowolnego wskaźnika w C++. Możemy użyć podwójnego wskaźnika, aby w dowolnym momencie tymczasowo wykorzystać lokalizację dowolnego wskaźnika w pamięci. Jest to bardzo skuteczny sposób pośredniego manipulowania adresem pamięci i dostępu do danych.