pointer
Főnév
pointer (tsz. pointers)
- (informatika) mutató
- (állattan) angol vadászvizsla; pointer
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.
1. Mi az a pointer (mutató)?
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.
Példa egy pointerre:
#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;
}
Kimenet:
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.
2. Pointerek deklarálása és inicializálása
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.
3. Pointerek használata memória kezelésére
A pointerek egyik legfontosabb felhasználási területe a dinamikus memóriafoglalás.
Dinamikus memóriafoglalás a new
és delete
kulcsszóval
int* 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]; // 5 elemű dinamikus tömb
for (int i = 0; i < 5; i++)
tomb[i] = i * 10;
for (int i = 0; i < 5; i++)
cout << tomb[i] << " ";
delete[] tomb; // A dinamikusan foglalt tömb felszabadítása
4. Pointer aritmetika
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[5] = {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.
5. Pointerek és tömbök kapcsolata
A C++ tömbök és pointerek szorosan összefüggenek.
int tomb[3] = {5, 10, 15};
int* ptr = tomb; // Az első elem címét kapja meg
cout << ptr[0] << endl; // 5
cout << ptr[1] << endl; // 10
cout << ptr[2] << endl; // 15
A ptr[i]
szintaxis ugyanaz, mint *(ptr + i)
.
6. Pointerek és függvények
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.
7. Pointerek és struktúrák
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
.
8. Null pointer és 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;
}
9. Többszintű pointerek (Pointer a pointerre)
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.
10. Okos pointerek (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.
Összegzés
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 - Szótár.net (en-hu)
- pointer - Sztaki (en-hu)
- pointer - Merriam–Webster
- pointer - Cambridge
- pointer - WordNet
- pointer - Яндекс (en-ru)
- pointer - Google (en-hu)
- pointer - Wikidata
- pointer - Wikipédia (angol)
Kiejtés
- IPA: /pwɛ̃.te/
Ige
pointer
Igeragozás
|