double pointer (tsz. double pointers)
A dupla mutató egy olyan mutató, amely egy másik mutató címét tárolja. Ha egy sima mutató egy változó címét tárolja, akkor a dupla mutató egy mutató címét tárolja.
int a = 5;
int* ptr = &a; // ptr mutat az a változóra
int a = 5;
int* ptr = &a; // ptr mutat az a változóra
int** doublePtr = &ptr; // doublePtr mutat ptr-re, tehát ptr címét tárolja
Itt doublePtr
egy mutató, amely a ptr
mutató címét tárolja. Ez lehetővé teszi számunkra, hogy indirekt módon elérjük az a
változó értékét, először a doublePtr
mutatón keresztül.
Most nézzünk egy gyakorlati példát, hogy hogyan használhatjuk a dupla mutatókat egy funkcióval, amely a paraméterek módosítását végzi el.
#include <iostream>
using namespace std;
void modifyValue(int** ptr) {
// A ptr egy dupla mutató, amely a mutató címét tartalmazza
**ptr = 10; // Elérjük a változót, amire ptr mutat, és módosítjuk az értékét
}
int main() {
int a = 5;
int* ptr = &a; // ptr mutat az a változóra
cout << "Az a eredeti értéke: " << a << endl;
modifyValue(&ptr); // Átadjuk ptr címét a modifyValue funkciónak
cout << "Az a módosított értéke: " << a << endl;
return 0;
}
Kimenet:
Az a eredeti értéke: 5 Az a módosított értéke: 10
Ebben a példában a modifyValue
funkció egy dupla mutatót vár, amely a ptr
címét tartalmazza. A dupla mutató segítségével módosítjuk a ptr
-tól mutatott értéket, ami az a
változó értéke.
A dupla mutatók használata többféle helyzetben hasznos lehet:
A dupla mutatók gyakran használatosak kétdimenziós tömbök kezelésére is. A kétdimenziós tömb valójában egy tömbnyi mutatót tartalmaz, így egy dupla mutató képes a tömbben lévő elemek elérésére.
#include <iostream>
using namespace std;
int main() {
int rows = 2, cols = 3;
int** arr = new int*; // Létrehozunk egy sorok számára mutató tömböt
// Minden sor számára foglalunk memóriát
for (int i = 0; i < rows; i++) {
arr = new int;
}
// Értékek hozzárendelése a kétdimenziós tömbhöz
arr = 1;
arr = 2;
arr = 3;
arr = 4;
arr = 5;
arr = 6;
// A kétdimenziós tömb kiíratása
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {
cout << arr << " ";
}
cout << endl;
}
// Memória felszabadítása
for (int i = 0; i < rows; i++) {
delete arr; // Minden sor memóriáját felszabadítjuk
}
delete arr; // A sorok számára allokált tömb memória felszabadítása
return 0;
}
Kimenet:
1 2 3 4 5 6
Ebben a példában egy kétdimenziós tömböt hozunk létre dinamikusan a dupla mutató segítségével, és értékeket rendelünk hozzá. Az első mutató a sorokat tartalmazza, míg a második mutató az oszlopokhoz rendelhető.
A dupla mutató (double pointer) egy mutató, amely egy másik mutató címét tárolja, és gyakran használják olyan helyzetekben, amikor egy függvénynek szüksége van arra, hogy módosítson egy mutatót, amit a hívó kód használ. A dupla mutatókat dinamikus memória kezelésére, kétdimenziós tömbök kezelésére és komplex adatszerkezetek kezelésére is használják. A C++ programozásban az ilyen típusú mutatók rendkívül hasznosak a memória kezelésében és a mutatók kezelésében.