reference to pointer (tsz. reference to pointers)
Ha egy függvény egy normál pointert vesz át paraméterként, akkor az a függvény lokális másolata lesz. Az eredeti pointer nem változik. Ha viszont referenciaként (*&
) adjuk át, akkor a függvény közvetlenül módosíthatja az eredeti pointert.
#include <iostream>
void changePointer(int* ptr) {
int newValue = 100;
ptr = &newValue; // Csak a lokális másolatot változtatja
}
int main() {
int num = 10;
int* p = #
changePointer(p); // Nem változtatja meg az eredeti 'p' értékét!
std::cout << "Érték: " << *p << std::endl; // Még mindig 10!
return 0;
}
❌ Hiba: A p
pointer nem módosult, mert a függvény csak a lokális másolatát változtatta meg.
#include <iostream>
void changePointer(int*& ptr) { // Referenciaként vesszük át a pointert!
int newValue = 100;
ptr = &newValue; // Most a valódi pointert változtatja
}
int main() {
int num = 10;
int* p = #
changePointer(p); // Most már megváltozik az eredeti 'p'
std::cout << "Érték: " << *p << std::endl; // Várhatóan 100, de veszélyes lehet!
return 0;
}
⚠️ Probléma: A newValue
lokális változó, így a függvény visszatérte után érvénytelen lesz! Ez függő mutatót (dangling pointer) eredményezhet.
Ha dinamikusan foglalunk memóriát, az helyesen működik:
#include <iostream>
void allocateMemory(int*& ptr) {
ptr = new int(100); // Új memóriaterület foglalása
}
int main() {
int* p = nullptr; // Kezdetben null mutató
allocateMemory(p); // Most p egy érvényes címre mutat
std::cout << "Érték: " << *p << std::endl; // 100
delete p; // Felszabadítás!
return 0;
}
✅ Most a függvény sikeresen megváltoztatta a pointer értékét és egy új memóriaterületre mutat.
Normál pointer paraméter | Referencia pointerre (*& )
| |
---|---|---|
Pointer módosítása a függvényen belül | ❌ Nem módosítja az eredeti pointert | ✅ Módosítja az eredeti pointert |
Használható dinamikus memóriafoglalásra | ❌ Nem lehet az eredeti pointert egy új memóriaterületre állítani | ✅ A pointer mutathat új memóriafoglalásra |
Függő mutatók veszélye | ⚠️ Ha lokális változóra mutatunk, érvénytelen lesz | ⚠️ Ugyanúgy lehet veszélyes, ha nem szabadítjuk fel a memóriát |
Ha a cél a pointer értékének módosítása egy függvényen belül, akkor referenciaként (*&
) kell átadni.