Ugrás a tartalomhoz

dereference operator

A Wikiszótárból, a nyitott szótárból


Főnév

dereference operator (tsz. dereference operators)

  1. (informatika) A C nyelv egyik legfontosabb és egyben legösszetettebb fogalma a mutatók (pointers) kezelése. A mutató olyan változó, amely egy másik változó memóriacímét tárolja. A mutatók használata nélkülözhetetlen a hatékony memóriakezeléshez, tömbök kezeléséhez, dinamikus memóriafoglaláshoz, illetve bizonyos programozási mintákhoz, mint például a referencia szerinti paraméterátadás.

A dereference operátor, amely a * karakter, kulcsfontosságú a mutatók kezelésében, mivel lehetővé teszi, hogy egy mutató által megadott memóriahelyen tárolt értéket olvassunk vagy írjunk. Más szóval: a mutató nem maga az érték, hanem annak a helye, ahol az érték van, és a dereference operátorral magát az értéket érhetjük el.



1. Mit jelent a dereference?

Legyen egy egyszerű példa:

int a = 10;
int *p = &a;

Itt az a egy egész szám típusú változó, melynek értéke 10. A p egy mutató, amely az a változó címét (&a) tárolja.

  • p maga egy memóriacím — egy szám, amely megmondja, hogy a memóriában hol található a.
  • *p pedig a dereference operátor használata, amely azt jelenti, hogy meg akarjuk kapni azt az értéket, amely a p által mutatott cím alatt található, vagyis magát az a értékét.

Ha kiírjuk:

printf("%d\n", *p); // 10

akkor az a kimenet, hogy 10, mert *p a p által mutatott cím alatt lévő érték.



2. Mire való a dereference?

A dereference operátor segítségével:

  • Elérhetjük és módosíthatjuk azt az adatot, amire a mutató mutat.
  • Tudunk referenciaként paramétert átadni függvényeknek.
  • Közvetlenül dolgozhatunk memóriacímmel, ami nagy szabadságot, de felelősséget is jelent.



3. Mutató és dereference – hasonlat

Gondoljunk egy postaládára (mutató), amely egy címre mutat. Maga a cím nem a levél, csak az információ, hogy hol van a levél.

  • A mutató a postaláda, mely tartalmaz egy címet.
  • A dereference az, amikor kinyitjuk ezt a postaládát és kiveszünk (vagy beleteszünk) egy levelet (értéket).



4. Kétféle jelentés a * operátornak

Fontos megérteni, hogy a * operátor kétféle szerepet tölthet be C-ben:

  • Deklarációban: amikor egy mutató típust jelöl, pl. int *p; — itt a * azt jelenti, hogy p egy pointer, egy egész számra mutató mutató.
  • Használatkor (kifejezésben): amikor egy mutató értékét “feloldjuk”, vagyis dereferálunk, pl. *p = 5; — itt a * a dereference operátor, amely az p által mutatott helyen tárolt érték elérését jelenti.



5. Hogyan működik a dereference a memóriában?

A mutatók a memória címeket tárolják, ezek olyan egész számok, amelyek a gép memóriájának helyét jelzik. Amikor egy mutató dereferálva van, a program az adott memóriacímen található értékhez fér hozzá.

A dereference operátor használata nélkül a mutató maga csak egy szám lenne, és nem tudnánk közvetlenül elérni a memóriában tárolt adatot.



6. Példa: érték elérése és módosítása

int x = 42;
int *px = &x;

printf("x = %d\n", x);     // 42
printf("*px = %d\n", *px); // 42

*px = 100; // módosítjuk a x értékét a dereferált mutató segítségével

printf("x = %d\n", x);     // 100

Ez jól mutatja, hogy a dereference operátorral az eredeti változó értékét tudjuk módosítani a mutatón keresztül.



7. Referencia-szerű viselkedés

C-ben nincs natív referencia típus, mint például C++-ban, de a mutatókat használjuk arra, hogy függvények paramétereként úgy adjunk át változókat, hogy azok eredeti értékei módosíthatók legyenek.

Példa:

void növel(int *p) {
    (*p)++;
}

int main() {
    int a = 10;
    növel(&a); // az 'a' címe kerül átadásra
    printf("%d\n", a); // 11
    return 0;
}

Itt a növel függvény egy mutatót vár, és a dereference operátor segítségével növeli az eredeti változó értékét.



8. Tömbök és dereference

A tömbök neve valójában egy pointerként viselkedik, amely az első elem címére mutat.

int tomb[3] = {1, 2, 3};
int *p = tomb;

printf("%d\n", *p);       // 1, az első elem értéke
printf("%d\n", *(p+1));   // 2, a második elem

A *(p + i) kifejezés a tömb i-edik elemének értékét jelenti.



9. Figyelmeztetések és hibák dereferáláskor

  • Null pointer dereferálása: Ha egy mutató értéke NULL (nem mutat sehova), és megpróbáljuk dereferálni, az futásidejű hibát okoz (pl. szegmens-hiba).
  • Érvénytelen cím dereferálása: Ha a mutató rossz memóriacímre mutat (pl. felszabadított memória, vagy soha nem inicializált mutató), akkor a dereferálás szintén hibás működéshez vezethet.

Ezért mindig ellenőrizni kell, hogy a mutató érvényes címre mutat-e mielőtt dereferálnánk.



10. Összefoglaló

  • A dereference operátor (*) segítségével a mutató által megadott memóriahelyen tárolt értéket érjük el.
  • Mutató nélkül nem tudunk közvetlenül memóriahelyeket kezelni.
  • A * lehet típuskijelölő és dereferáló operátor is, attól függően, hogy deklarációban vagy kifejezésben használjuk.
  • Dereferáláskor lehetőségünk van olvasni és írni a mutató által mutatott helyen lévő adatot.
  • Alapvető a dinamikus memória kezeléshez, függvények referencia szerinti paraméterátadásához, valamint tömbök és adatszerkezetek kezeléséhez.