Mind a mutatók, mind a referenciák a C és C ++ legerősebb tulajdonságai, amelyek lehetővé teszik a programozók számára, hogy a memória címét közvetlenül manipulálják a hatékony memóriakezelés érdekében..
Mindkettő olyan változó, amely közvetett módon utal más objektumokra, és a felületen néhány közös vonással rendelkeznek. Noha sok közös képességgel rendelkeznek, megérteni őket is nagyon bonyolult.
A mutató olyan változó, amely egy másik változó memóriacímét tartja, míg a hivatkozás olyan, mint egy mutató, amely felhasználható egy másik változó közvetett hivatkozására..
Úgy tűnik, hogy a legtöbb programozó megérti nézeteit a mutatók és a referenciák használatáról, ám gyakran találkoznak olyan problémákkal, amelyek megoldása nem egyértelmű..
Tehát a filozófia jobb megértése érdekében megértjük a kettő közötti különbséget.
Minden változó egy memóriahely, amelyet a címe határoz meg, és egy azonosítóval párosul, amely olyan értéket tartalmaz, amely megváltoztatható egy program folyamán. Egyszerűen fogalmazva: a változó egy szimbólum, amely egy mennyiséget jelöl.
A mutató olyan változó, amely egy másik változó memóriacímét tartalmazza. A mutató nem más, mint egy cím, és egy mutatót tároló változót mutató mutatónak hívunk.
Az ötlet az, hogy numerikus címek helyett azonosítókat (vagy neveket) használjon a programozás terheinek megkönnyítésére, ezáltal csökkentve a programok összetettségét. Mivel ezek a címek a számítógép memóriájának tényleges helyére vonatkoznak, a mutatók felhasználhatók a memóriában tárolt tartalmak elérésére és kezelésére.
Mint minden változót vagy állandót, a mutatókat meg kell adni a típusukra vonatkozóan. Mivel a mutatók különálló adattípushoz tartozó memóriacímeket tartalmaznak, azokat mutatók használatával kell deklarálni, mielőtt velük dolgozhat. A mutatónyilatkozat általános formája:
Data_type * var-name;
Itt az „Data_type” a mutató alaptípusa, a „var-name” pedig a mutató változója. A csillag (*) itt azt a mutatót deklarálja, amely a „var-name” változót mutató mutatóként jelöli..
int * p; // egész mutató
úszó * x; // úszó mutató
A „p” változó itt egy egész adattípusra mutat, amelyet „int” -nek deklarálnak, amely a változó adattípusára utal. Hasonlóképpen, a második példában az „úszó” az „x” változó adattípusára utal, amelyet valójában egy lebegőpontos változó mutatójának jelölnek..
A hivatkozás olyan, mint egy mutató, amelynek közvetett hozzáférése van egy változóhoz. Olyan, mint egy másik változó álneve, vagyis egy már létező változónak csak egy új neve.
Ez lehetővé teszi a programozók számára, hogy hozzanak létre egy második nevet a változó számára, amelyet felhasználhatnak az adott változóban tárolt tartalom manipulálására. Ez egy entitás, amely egy másik változó álneve, és ugyanazzal a címmel rendelkezik, mint az eredeti változó. Támogatja az pass-by-reference hivatkozást, amely funkcionális formális paraméterekként működik, és miután meghatározásra került egy változóra való hivatkozás, nem lehet újrabeállítani, ami azt jelenti, hogy nem utalható egy másik változóra.
A mutatókkal ellentétben, az érték eléréséhez nincs szükség a hivatkozás lekérdezésére; Valójában normál változókhoz hasonlóan használhatók.
int i;
int & ri = i;
Itt az „ri” egy egész hivatkozás, amelyet „i” -re állítunk be. A „ri” -t az „int int” hivatkozás típusú objektumnak nyilvánítja. A hivatkozás könnyen összetéveszthető egy olyan mutatóval, amely egy független változó, amelynek címértékeit nem lehet újra hozzárendelni létrehozás után.
- Mindkettő szinte hasonló képességeket biztosít a használhatóság szempontjából, és a megkülönböztetés trükkös lehet. A mutató csak egy olyan változó, amely egy másik változó memóriacímét tárolja, míg a hivatkozás olyan, mint egy már létező változó álneve. Ez létrehoz egy második nevet a változó számára, amely felhasználható az adott változóban tárolt tartalom módosítására.
- A mutató olyan, mint bármely más változó, amely egy darabot tárol. Más változókkal ellentétben a mutatóváltozatok az értékek helyett a memóriacímeket tárolják. Egy mutatóra hivatkozást nem vonunk le az indirection operátor * segítségével, hogy elérjük annak a változónak a memóriahelyét, amelyre mutat. Ugyanakkor a referenciának nincs szüksége sereferencia-operátorra az érték eléréséhez.
- Ellentétben a bármikor inicializálható mutatókkal, a referenciákat az inicializáláskor hozzá kell rendelni. A mutatók közvetlenül érhetők el, míg a hivatkozások nem érhetők el közvetlenül.
- Egy mutatóváltozónak megvan a saját helye a memóriában, ami azt jelenti, hogy amikor egy mutatót deklarál, akkor meg kell adnia egy helyet, amely az egyes memóriaegységekhez rendelt memóriacím. A mutatóváltozónak ugyanaz a címe, ahova a memóriába ment. A referenciaváltozó viszont egy másik változó álneve, ezzel figyelembe véve a referenciaváltozó címét.
- A NULL a lista végét jelenti, azaz azt jelzi, hogy az érték ismeretlen, és meghatározza, hogy a változónak nincs érvényes címtere. A NULL értéket közvetlenül hozzá lehet rendelni egy mutatóváltozóhoz, ami azt sugallja, hogy nem mutat sehol, míg a NULL nem rendelhető referenciaváltozóhoz..
A mutatók mindig is voltak a C / C ++ programozók kedvenc megbeszéléseinek témái, amíg a referenciák nem jöttek a képre. A referenciák némileg hasonlítanak a mutatókhoz, de összehasonlítva meglehetősen jó az előnyeik és hátrányaik. Bár mindkettő felhasználható az egyik függvény lokális változóinak megváltoztatására egy másik függvényen belül, vannak különbségeik. Mindkettő a C és a C ++ nagy teljesítményű tulajdonságai, amelyek lehetővé teszik a memória közvetlen kezelését, néhány kivételtől eltekintve. Egy mutató egy változó memóriacímét tartja, míg a hivatkozás csak egy másik változó álneve.