pointer (tsz. pointers)
A pointerek (mutatók) a C++ egyik legerősebb, de sokak számára kezdetben nehezen érthető funkciói. A pointerek lehetővé teszik a memóriacímek kezelését, ami hatékonyabb memóriahasználatot és nagyobb rugalmasságot biztosít a programok számára. Ebben a cikkben részletesen bemutatjuk a pointerek működését, típusait és alkalmazási lehetőségeit.
A pointer egy speciális változó, amely egy másik változó memóriacímét tárolja. Míg egy hagyományos változó egy adott értéket tartalmaz, addig egy pointer azt mondja meg, hogy egy adott érték hol található a memóriában.
#include <iostream>
using namespace std;
int main() {
int szam = 10; // Egy normál változó
int* ptr = &szam; // Pointer, amely a szam változó címét tárolja
cout << "szam erteke: " << szam << endl;
cout << "szam memoria cime: " << &szam << endl;
cout << "ptr erteke (szam cime): " << ptr << endl;
cout << "ptr altal mutatott ertek: " << *ptr << endl;
return 0;
}
szam erteke: 10 szam memoria cime: 0x61ff08 (példa) ptr erteke (szam cime): 0x61ff08 ptr altal mutatott ertek: 10
Magyarázat: - Az &
operátor visszaadja egy változó memóriacímét. - A *
operátor (dereferencia operátor) lehetővé teszi, hogy egy pointer által mutatott értéket elérjük.
Egy pointer deklarálásakor meg kell adni az általa mutatott változó típusát is.
Általános szintaxis:
tipus* pointer_nev;
Példák:
int* ptr; // Egész számokra mutató pointer
double* dptr; // Lebegőpontos számokra mutató pointer
char* cptr; // Karakterekre mutató pointer
Egy pointert inicializálni kell, mielőtt használjuk! Ha nem inicializáljuk, akkor véletlenszerű memóriacímet tartalmazhat.
A pointerek egyik legfontosabb felhasználási területe a dinamikus memóriafoglalás.
new
és delete
kulcsszóvalint* ptr = new int; // Foglal egy egész számnyi memóriát
*ptr = 25; // Az így foglalt memóriába írunk egy értéket
cout << *ptr << endl; // Kiírja: 25
delete ptr; // A lefoglalt memória felszabadítása
Tömbök foglalása:
int* tomb = new int; // 5 elemű dinamikus tömb
for (int i = 0; i < 5; i++)
tomb = i * 10;
for (int i = 0; i < 5; i++)
cout << tomb << " ";
delete tomb; // A dinamikusan foglalt tömb felszabadítása
A pointerek támogatják az aritmetikai műveleteket, amelyeket főként tömbök kezelésére használunk.
Példa:
int tomb = {10, 20, 30, 40, 50};
int* ptr = tomb; // A pointer az első elemre mutat
cout << *ptr << endl; // Kiírja: 10
cout << *(ptr + 1) << endl; // Kiírja: 20
cout << *(ptr + 2) << endl; // Kiírja: 30
Itt a pointer a következő címre lép, mivel a C++ automatikusan figyelembe veszi a mutatott típus méretét.
A C++ tömbök és pointerek szorosan összefüggenek.
int tomb = {5, 10, 15};
int* ptr = tomb; // Az első elem címét kapja meg
cout << ptr << endl; // 5
cout << ptr << endl; // 10
cout << ptr << endl; // 15
A ptr
szintaxis ugyanaz, mint *(ptr + i)
.
Függvényekhez is átadhatunk pointereket.
void duplaz(int* p) {
*p *= 2;
}
int main() {
int szam = 10;
duplaz(&szam);
cout << szam << endl; // Kiírja: 20
}
A pointerrel átadott változó módosul, mert a függvény közvetlenül a memóriacímre mutat.
Struktúrák (struct) esetén is használhatunk pointereket.
struct Ember {
string nev;
int eletkor;
};
int main() {
Ember e = {"Peter", 30};
Ember* ptr = &e;
cout << ptr->nev << " " << ptr->eletkor << endl; // Peter 30
}
A ptr->nev
ugyanaz, mint (*ptr).nev
.
nullptr
Ha egy pointer nem mutat sehova, érdemes nullptr
-ral inicializálni.
int* ptr = nullptr;
Ellenőrizhetjük is:
if (ptr == nullptr) {
cout << "A pointer nem mutat sehova." << endl;
}
Egy pointer mutathat egy másik pointerre is.
int szam = 10;
int* ptr = &szam;
int** ptr2 = &ptr;
cout << **ptr2 << endl; // 10
Ez hasznos lehet többszintű adatszerkezetek kezelésénél.
unique_ptr
, shared_ptr
)A C++11 bevezette az okos pointereket, amelyek automatikusan felszabadítják a memóriát.
#include <memory>
using namespace std;
int main() {
unique_ptr<int> ptr = make_unique<int>(10);
cout << *ptr << endl; // 10
}
A shared_ptr
több helyen is használható, és az utolsó példány törlésekor szabadítja fel a memóriát.
A pointerek kulcsszerepet játszanak a C++ programozásban, és lehetővé teszik a hatékony memóriahasználatot, a dinamikus memóriakezelést és az alacsony szintű programozást. A megfelelő használatuk elengedhetetlen nagyobb C++ projektek esetén.
pointer
|