Ukazatele i odkazy jsou nejúčinnějšími funkcemi v C a C ++, které umožňují programátorům přímo manipulovat s adresou paměti pro efektivní správu paměti.
Obě jsou proměnné, které se používají k nepřímému odkazování na jiné objekty a sdílejí některé společné rysy na povrchu. Přestože sdílejí mnoho společných schopností, je také velmi složité jim porozumět.
Ukazatel je proměnná, která drží adresu paměti jiné proměnné, zatímco odkaz je jako ukazatel, který lze použít k nepřímému odkazu na jinou proměnnou..
Zdá se, že většina programátorů pochopila, kdy používat ukazatele a kdy používat odkazy, ale často se setkávají s problémy, jejichž řešení se zdá nejasné..
Abychom lépe porozuměli filozofii, pojďme porozumět rozdílu mezi nimi.
Každá proměnná je umístění v paměti, které je definováno svou adresou a je spárováno s identifikátorem, který obsahuje určitou hodnotu, kterou lze během programu změnit. Jednoduše řečeno, proměnná je symbol, který představuje množství.
Ukazatel je proměnná, která obsahuje adresu paměti jiné proměnné. Ukazatel není nic jiného než adresa a proměnná, která ukládá ukazatel, se nazývá ukazatelová proměnná.
Záměrem je použít identifikátory (nebo jména) místo číselných adres, aby se snížilo zatížení programováním, čímž se sníží složitost programů. Protože tyto adresy odkazují na skutečná umístění v paměti počítače, lze ukazatele použít k přístupu a manipulaci s obsahem uloženým v paměti.
U proměnných nebo konstant musí být ukazatele deklarovány pro jejich typy. Protože ukazatele obsahují adresy paměti, které patří do samostatného datového typu, musí být deklarovány pomocí ukazatelů, abyste s nimi mohli pracovat. Obecná forma prohlášení ukazatele je:
Data_type * var-name;
Zde je „Data_type“ základním typem ukazatele a „var-name“ je proměnná ukazatele. Hvězdička (*) se zde používá k deklaraci ukazatele, který označuje proměnnou „var-name“ jako proměnnou ukazatele.
int * p; // celé číslo ukazatel
float * x; // plovoucí ukazatel
Proměnná „p“ zde ukazuje na celočíselný datový typ, který je deklarován jako „int“, který odkazuje na datový typ proměnné. Podobně v druhém příkladu „float“ označuje datový typ proměnné „x“, který je ve skutečnosti označen jako ukazatel na proměnnou s pohyblivou řádovou čárkou.
Odkaz je jako ukazatel s nepřímým přístupem k proměnné. Je to jako alias pro jinou proměnnou, což znamená, že je to jen jiné jméno pro již existující proměnnou.
Umožňuje programátorům vytvořit druhé jméno pro proměnnou, kterou mohou použít k manipulaci s obsahem uloženým v této proměnné. Je to entita, která je aliasem jiné proměnné a má stejnou adresu jako původní proměnná. Podporuje pass-by-reference, fungující jako funkční formální parametry, a jakmile je definována jako odkaz na proměnnou, nelze ji znovu opakovat, což znamená, že ji nelze odkazovat na jinou proměnnou.
Na rozdíl od ukazatelů pro přístup k hodnotě nepotřebují dereferenční operátor; ve skutečnosti je lze použít jako normální proměnné.
int i;
int & ri = i;
Zde je „ri“ celé číslo inicializované na „i“. Deklaruje „ri“ jako objekt typu „odkaz na int“. Odkaz lze snadno zaměnit s ukazatelem, který je nezávislou proměnnou, jejíž hodnoty adresy nelze po vytvoření znovu přiřadit.
- Obě poskytují téměř podobné schopnosti, pokud jde o použitelnost, a rozlišení může být složité. Ukazatel je pouze proměnná, která ukládá adresu paměti jiné proměnné, zatímco odkaz je jako alias pro již existující proměnnou. Vytvoří druhé jméno pro proměnnou, kterou lze použít k úpravě obsahu uloženého v této proměnné.
- Ukazatel je jako každá jiná proměnná, která ukládá část dat. Na rozdíl od jiných proměnných proměnné ukazatele ukládají adresy paměti místo hodnot. Ukazatel je dereferencován pomocí operátoru přesměrování * pro přístup k umístění paměti proměnné, na kterou ukazuje. Na druhou stranu reference nepotřebuje k přístupu k hodnotě žádný operátor dereferencí.
- Na rozdíl od ukazatelů, které lze kdykoli inicializovat, musí být při inicializaci přiřazeny odkazy. Ukazatele lze získat přímo, zatímco na odkazy nelze přímo přistupovat.
- Proměnná ukazatele má své vlastní umístění v paměti, což znamená, že když deklarujete ukazatel, určíte umístění, což je adresa paměti přiřazená každé jednotce paměti. Proměnná ukazatele má stejnou adresu, kde je uložena v paměti. Na druhé straně referenční proměnná je alias pro jinou proměnnou, čímž se vezme adresa referenční proměnné.
- NULL představuje konec seznamu, což znamená, že hodnota je neznámá a určuje, že proměnná nemá platný adresní prostor. Hodnotu NULL lze přímo přiřadit proměnné ukazatele, což naznačuje, že nikam nevede, zatímco NULL nelze přiřadit referenční proměnné..
Ukazatele byly vždy mezi oblíbenými tématy diskuse programátorů C / C ++, dokud se neobjevily odkazy na obrázek. Odkazy jsou poněkud podobné ukazatelům, ale mají ve srovnání se svými výhodami i nevýhodami spravedlivý podíl. Zatímco obě mohou být použity ke změně lokálních proměnných jedné funkce v rámci jiné funkce, mají své rozdíly. Oba jsou výkonné funkce v C a C ++, které vám umožňují přímo manipulovat s pamětí, ale až na několik výjimek. Ukazatel uchovává adresu paměti proměnné, zatímco odkaz je pouze alias pro jinou proměnnou.