Rozdiel medzi ukazovateľom a referenciou

Ukazovatele aj odkazy sú najúčinnejšími funkciami v C a C ++, ktoré umožňujú programátorom priamo manipulovať s adresou pamäte pre efektívnu správu pamäte.

Obidve sú premenné, ktoré sa používajú na nepriamy odkaz na iné objekty a zdieľajú niektoré spoločné vlastnosti na povrchu. Aj keď zdieľajú veľa bežných schopností, je ich pochopenie veľmi zložité.

Ukazovateľ je premenná, ktorá drží pamäťovú adresu inej premennej, zatiaľ čo odkaz je ako ukazovateľ, ktorý sa môže použiť na nepriame odkázanie na inú premennú..

Zdá sa, že väčšina programátorov si uvedomuje, kedy používať ukazovatele a kedy používať referencie, často sa však stretávajú s problémami, ktorých riešenie sa zdá nejasné..

Aby sme lepšie pochopili filozofiu, pochopme rozdiel medzi nimi.

Čo je ukazovateľ?

Každá premenná je miesto v pamäti, ktoré je definované svojou adresou a je spárované s identifikátorom, ktorý obsahuje určitú hodnotu, ktorú je možné zmeniť v priebehu programu. Jednoducho povedané, premenná je symbol, ktorý predstavuje množstvo.

Ukazovateľ je premenná, ktorá obsahuje adresu pamäte inej premennej. Ukazovateľ nie je nič iné ako adresa a premenná, ktorá ukladá ukazovateľ, sa nazýva ukazovateľová premenná.

Cieľom je používať namiesto číselných adries identifikátory (alebo mená) na uľahčenie zaťaženia programovaním, čím sa zníži zložitosť programov. Pretože tieto adresy odkazujú na skutočné umiestnenia v pamäti počítača, ukazovatele môžu byť použité na prístup a manipuláciu s obsahom uloženým v pamäti.

Ukazovatele, ako každá premenná alebo konštanta, musia byť deklarované pre svoje typy. Pretože ukazovatele obsahujú adresy pamäte, ktoré patria do samostatného dátového typu, musia sa pred tým, ako s nimi budete pracovať, deklarovať pomocou ukazovateľov. Všeobecná forma vyhlásenia ukazovateľa je:

Data_type * var-name;

Tu je „Data_type“ základným typom ukazovateľa a „var-name“ je premenná ukazovateľa. Hviezdička (*) sa tu používa na vyhlásenie ukazovateľa, ktorý označuje premennú „var-name“ ako ukazovateľovú premennú.

int * p; // celé číslo

float * x; // plavákový ukazovateľ

Premenná „p“ tu označuje celočíselný typ údajov, ktorý sa deklaruje ako „int“ a ktorý sa vzťahuje na typ údajov premennej. Podobne v druhom príklade „float“ označuje dátový typ premennej „x“, ktorá sa v skutočnosti označuje ako ukazovateľ premennej s pohyblivou rádovou čiarkou.

Čo je referencia?

Odkaz je ako ukazovateľ s nepriamym prístupom k premennej. Je to ako alias pre inú premennú, čo znamená, že ide iba o iný názov pre už existujúcu premennú.

Programátorom umožňuje vytvoriť druhé meno pre premennú, s ktorou môžu manipulovať s obsahom uloženým v tejto premennej. Je to entita, ktorá je alias pre inú premennú a má rovnakú adresu ako pôvodná premenná. Podporuje funkciu pass-by-reference, ktorá funguje ako funkčné formálne parametre a keď je definovaná ako referencia na premennú, nie je možné ju znova opakovať, čo znamená, že ju nemožno odkazovať na inú premennú.

Na rozdiel od ukazovateľov nepotrebujú na prístup k hodnote operátor dereferencie; v skutočnosti ich možno použiť ako normálne premenné.

int i;

int & ri = i;

Tu je „ri“ celočíselný odkaz inicializovaný na „i“. Deklaruje „ri“ ako objekt typu „odkaz na int“. Odkaz sa dá ľahko zamieňať s ukazovateľom, ktorý je nezávislou premennou, ktorej hodnoty adresy nemožno po vytvorení znovu priradiť..

Rozdiel medzi ukazovateľom a referenciou

  1. Základy ukazovateľa a referencie

- Obidve poskytujú takmer podobné schopnosti, pokiaľ ide o použiteľnosť, a rozlíšenie môže byť zložité. Ukazovateľ je iba premenná, ktorá ukladá adresu pamäte inej premennej, zatiaľ čo referencia je ako alias pre už existujúcu premennú. Vytvára druhé meno pre premennú, ktorú je možné použiť na úpravu obsahu uloženého v tejto premennej.

  1. Vyhlásenie ukazovateľa a referencie

- Ukazovateľ je ako každá iná premenná, ktorá ukladá časť údajov. Na rozdiel od iných premenných premenné ukazovateľa ukladajú adresy pamäte namiesto hodnôt. Ukazovateľ je dereferencovaný pomocou operátora presmerovania * na prístup k umiestneniu pamäte premennej, na ktorú ukazuje. Na druhej strane referencia nepotrebuje pre prístup k hodnote žiadny operátor dereferencie.

  1. Opätovné pridelenie ukazovateľa a referencie

- Na rozdiel od ukazovateľov, ktoré môžu byť inicializované kedykoľvek, musia byť referencie priradené pri inicializácii. Ukazovatele sú prístupné priamo, zatiaľ čo odkazy nie sú prístupné priamo.

  1. Adresa pamäte pre ukazovateľ a referenciu

- Premenná ukazovateľa má svoje vlastné umiestnenie v pamäti, čo znamená, že keď deklarujete ukazovateľ, zadáte umiestnenie, ktoré je adresou pamäte priradenou každej jednotke pamäte. Premenná ukazovateľa má rovnakú adresu, na ktorej je uložená v pamäti. Na druhej strane, referenčná premenná je alias pre inú premennú, čím sa vezme adresa referenčnej premennej.

  1. NULL Hodnota pre ukazovateľ a referenciu

- NULL predstavuje koniec zoznamu, čo znamená, že hodnota nie je známa a určuje, že premenná nemá platný adresný priestor. NULL hodnotu je možné priradiť priamo k ukazovacej premennej, čo naznačuje, že nikam neukazuje, zatiaľ čo NULL nemožno priradiť k referenčnej premennej.

Ukazovateľ verzus referencia: porovnávacia tabuľka

Zhrnutie ukazovateľa verzus referencie

Ukazovatele boli vždy medzi obľúbenými témami diskusie programátorov C / C ++, až kým sa neobjavili odkazy na obrázok. Odkazy sú do istej miery podobné ukazovateľom, ale v porovnaní s nimi majú spravodlivý podiel na výhodách a nevýhodách. Aj keď obidve môžu byť použité na zmenu lokálnych premenných jednej funkcie v rámci inej funkcie, majú svoje rozdiely. Obidve sú výkonné funkcie v C a C ++, ktoré vám umožňujú priamo manipulovať s pamäťou, ale až na pár výnimiek. Ukazovateľ drží adresu pamäte premennej, zatiaľ čo referencia je iba alias pre inú premennú.