Zarówno wskaźniki, jak i referencje są najpotężniejszymi funkcjami w C i C ++, które pozwalają programistom bezpośrednio manipulować adresem pamięci w celu efektywnego zarządzania pamięcią.

Oba są zmiennymi, które są używane do pośredniego odwoływania się do innych obiektów i mają pewne wspólne cechy na powierzchni. Chociaż mają wiele wspólnych możliwości, są również bardzo skomplikowane do zrozumienia.

Wskaźnik jest zmienną, która przechowuje adres pamięci innej zmiennej, podczas gdy referencja jest jak wskaźnik, który może być użyty do pośredniego odwołania się do innej zmiennej.





Większość programistów wydaje się rozwijać pewne zrozumienie, kiedy używać wskaźników i kiedy używać referencji, ale często napotykają problemy, których rozwiązanie wydaje się niejasne.

Aby więc lepiej zrozumieć filozofię, zrozummy różnicę między nimi.

Czym jest wskaźnik?

Każda zmienna jest miejscem w pamięci, które jest określone przez swój adres i jest sparowane z identyfikatorem, który zawiera pewną wartość, która może być zmieniona w trakcie działania programu. W prostych słowach, zmienna jest symbolem, który reprezentuje ilość.



Wskaźnik to zmienna, która zawiera adres pamięci innej zmiennej. Wskaźnik to nic innego jak adres, a zmienna przechowująca wskaźnik nazywana jest zmienną wskazującą.

Ideą jest używanie identyfikatorów (lub nazw) zamiast adresów numerycznych, aby odciążyć programowanie, zmniejszając tym samym złożoność programów. Ponieważ adresy te odnoszą się do rzeczywistych miejsc w pamięci komputera, wskaźniki mogą być używane do dostępu i manipulowania zawartością przechowywaną w pamięci.



Jak każda zmienna lub stała, wskaźniki muszą być zadeklarowane dla swoich typów. Ponieważ wskaźniki zawierają adresy pamięci, które należą do osobnego typu danych, muszą być zadeklarowane przy użyciu wskaźników, zanim będzie można z nimi pracować. Ogólna postać deklaracji wskaźnika to:

Data_type * var-name;



Tutaj „Data_type” jest typem bazowym wskaźnika, a „var-name” jest zmienną wskaźnika. Gwiazdka (*) służy tutaj do deklaracji wskaźnika, który wyznacza zmienną „var-name” jako zmienną wskaźnikową.

int *p; // wskaźnik na liczbę całkowitą

float *x; // wskaźnik na zmienną typu float

Tutaj zmienna „p” wskazuje na całkowity typ danych, który jest zadeklarowany jako „int”, który odnosi się do typu danych zmiennej. Podobnie w drugim przykładzie, „float” odnosi się do typu danych zmiennej „x”, która w rzeczywistości jest oznaczona jako wskaźnik do zmiennej zmiennoprzecinkowej.



Co to jest referencja?

Referencja jest jak wskaźnik z pośrednim dostępem do zmiennej. Jest jak alias dla innej zmiennej, czyli jest to po prostu inna nazwa dla już istniejącej zmiennej.

Pozwala programistom stworzyć drugą nazwę dla zmiennej, której mogą użyć do manipulowania zawartością przechowywaną w tej zmiennej. Jest to jednostka, która jest aliasem dla innej zmiennej i ma ten sam adres, co oryginalna zmienna. Obsługuje pass-by-reference działając jako parametry formalne funkcji i raz zdefiniowany, aby odnieść się do zmiennej, nie może być ponownie zlokalizowany, co oznacza, że nie można go odnieść do innej zmiennej.

W przeciwieństwie do wskaźników, nie potrzebują one operatora dereferencji, aby uzyskać dostęp do wartości; w rzeczywistości mogą być używane jak normalne zmienne.



int i;

int &ri = i;

Tutaj „ri” jest referencją liczby całkowitej zainicjowaną do „i”. Deklaruje „ri” jako obiekt typu „odniesienie do int”. Referencję można łatwo pomylić ze wskaźnikiem, który jest zmienną niezależną, której wartości adresowe nie mogą być ponownie przypisane po utworzeniu.

Różnica między wskaźnikiem a referencją

Podstawy wskaźnika i referencji



– Oba zapewniają prawie podobne możliwości pod względem użyteczności, a rozróżnienie może być podstępne. Wskaźnik to po prostu zmienna, która przechowuje adres pamięci innej zmiennej, podczas gdy referencja jest jak alias dla już istniejącej zmiennej. Tworzy drugą nazwę dla zmiennej, która może być użyta do modyfikacji zawartości przechowywanej w tej zmiennej.

Deklaracja wskaźnika i referencji

– Wskaźnik jest jak każda inna zmienna, która przechowuje kawałek danych. W przeciwieństwie do innych zmiennych, zmienne wskaźnikowe przechowują adresy pamięci zamiast wartości. Wskaźnik jest dereferencjonowany przy użyciu operatora indeksu *, aby uzyskać dostęp do miejsca w pamięci zmiennej, na którą wskazuje. Z drugiej strony, referencja nie potrzebuje żadnego operatora dereferencji, aby uzyskać dostęp do wartości.

Ponowne przypisanie wskaźnika i referencji



– W przeciwieństwie do wskaźników, które mogą być inicjalizowane w dowolnym momencie, referencje muszą być przypisane podczas inicjalizacji. Do wskaźników można uzyskać bezpośredni dostęp, podczas gdy do referencji nie można uzyskać bezpośredniego dostępu.

Adres pamięci dla wskaźnika i referencji

– Zmienna wskazująca ma swoją własną lokalizację w pamięci, co oznacza, że kiedy deklarujesz wskaźnik, określasz lokalizację, która jest adresem pamięci przypisanym do każdej jednostki pamięci. Zmienna pointerowa ma ten sam adres, pod którym jest zapisana w pamięci. Natomiast zmienna referencyjna jest aliasem dla innej zmiennej tym samym przyjmuje adres zmiennej referencyjnej.

Wartość NULL dla wskaźnika i referencji

– NULL reprezentuje koniec listy, co oznacza, że wartość jest nieznana i określa, że zmienna nie ma prawidłowej przestrzeni adresowej. Wartość NULL może być przypisana bezpośrednio do zmiennej wskaźnikowej, co sugeruje, że nie wskazuje ona nigdzie, natomiast NULL nie może być przypisany do zmiennej referencyjnej.

Podsumowanie Pointer vs. Reference

Wskaźniki zawsze należały do ulubionych tematów dyskusji programistów C/C++, dopóki nie pojawiły się referencje. Referencje są nieco podobne do wskaźników, ale mają swój udział w plusach i minusach. Chociaż oba mogą być używane do zmiany zmiennych lokalnych jednej funkcji w ramach innej funkcji, mają swoje różnice. Obie są potężnymi funkcjami w C i C ++, które pozwalają na bezpośrednie manipulowanie pamięcią, ale z kilkoma wyjątkami. Wskaźnik przechowuje adres pamięci zmiennej, podczas gdy referencja jest tylko aliasem dla innej zmiennej.