Wskaźnik i odniesienie

Anonim

Zarówno wskaźniki, jak i referencje to najpotężniejsze funkcje w C i C ++, które umożliwiają programistom manipulowanie adresami pamięci bezpośrednio w celu wydajnego zarządzania pamięcią.

Obie są zmiennymi, które pośrednio odnoszą się do innych obiektów i mają wspólne cechy na powierzchni. Chociaż mają wiele wspólnych zdolności, są również bardzo skomplikowane w zrozumieniu.

Wskaźnik jest zmienną przechowującą adres pamięci innej zmiennej, podczas gdy odniesienie jest jak wskaźnik, który może być użyty do pośredniego odniesienia do innej zmiennej.

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

Aby lepiej zrozumieć filozofię, zrozumiemy różnicę między tymi dwoma.

Co to jest wskaźnik?

Każda zmienna to miejsce w pamięci, które jest zdefiniowane przez jego adres i jest sparowane z identyfikatorem, który zawiera pewną wartość, którą można zmienić w trakcie programu. W uproszczeniu zmienna jest symbolem reprezentującym ilość.

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

Chodzi o to, aby zamiast adresów numerycznych używać identyfikatorów (lub nazw), aby zmniejszyć obciążenie programowania, zmniejszając w ten sposób złożoność programów. Ponieważ adresy te odnoszą się do rzeczywistych lokalizacji w pamięci komputera, wskaźniki mogą być używane do uzyskiwania dostępu i manipulowania zawartością przechowywaną w pamięci.

Podobnie jak każda zmienna lub stała, wskaźniki muszą być zadeklarowane dla ich typów. Ponieważ wskaźniki zawierają adresy pamięci, które należą do oddzielnego typu danych, muszą być zadeklarowane za pomocą wskaźników, aby móc z nimi pracować. Ogólną formą deklaracji wskaźnika jest:

Typ danych * nazwa-zmiennej;

W tym przypadku typem danych jest wskaźnik "Data_type", a zmienną wskaźnika jest "var-name". Gwiazdka (*) służy do zadeklarowania wskaźnika, który wyznacza zmienną "nazwa-zmiennej" jako zmienną wskaźnika.

int * p; // wskaźnik liczb całkowitych

float * x; // wskaźnik pływający

W tym przypadku zmienna "p" wskazuje na typ danych integer, 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 wyznaczona jako wskaźnik do zmiennej zmiennoprzecinkowej.

Co to jest referencja?

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

Umożliwia programistom tworzenie drugiej nazwy zmiennej, której mogą używać do manipulowania treścią przechowywaną w tej zmiennej. Jest to encja, która jest aliasem dla innej zmiennej i ma ten sam adres, co oryginalna zmienna. Obsługuje przekazywanie referencyjne, działając jako formalne parametry funkcji i po zdefiniowaniu, aby odnosiło się do zmiennej, nie można jej ponownie umieścić, co oznacza, że ​​nie można jej powiązać z inną zmienną.

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

int i;

int & ri = i;

W tym przypadku "ri" jest odwołaniem całkowitym zainicjowanym na "i". Deklaruje "ri" jako obiekt typu "odniesienie do int". Odwołanie można łatwo pomylić ze wskaźnikiem, który jest zmienną niezależną, której wartości adresu nie można ponownie przypisać po utworzeniu.

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

  1. Podstawy wskaźnika i odniesienia

- Oba zapewniają prawie podobne możliwości pod względem użyteczności, a rozróżnienie może być trudne. Wskaźnik jest po prostu zmienną przechowującą adres pamięci innej zmiennej, podczas gdy odwołanie jest jak alias dla już istniejącej zmiennej. Tworzy drugą nazwę zmiennej, której można użyć do modyfikowania zawartości zapisanej w tej zmiennej.

  1. Deklaracja wskaźnika i odniesienia

- Wskaźnik jest jak każda inna zmienna przechowująca dane. W przeciwieństwie do innych zmiennych, zmienne wskaźnika przechowują adresy pamięci zamiast wartości. Wskaźnik jest dereferencjonowany za pomocą operatora indeksu *, aby uzyskać dostęp do lokalizacji pamięci zmiennej, którą wskazuje. Z drugiej strony, odwołanie nie wymaga od operatora dereferencyjnego dostępu do wartości.

  1. Zmiana przypisania wskaźnika i odniesienia

- W przeciwieństwie do wskaźników, które można zainicjować w dowolnym momencie, podczas inicjalizacji należy przypisać referencje. Dostęp do wskaźników można uzyskać bezpośrednio, natomiast odwołania nie mogą być bezpośrednio dostępne.

  1. Adres pamięci dla wskaźnika i odniesienia

- Zmienna wskaźnika ma swoją własną lokalizację w pamięci, co oznacza, że ​​po zadeklarowaniu wskaźnika określa się lokalizację, która jest adresem pamięci przypisanym do każdej jednostki pamięci. Zmienna wskaźnika ma ten sam adres, w którym jest zapisany w pamięci. Z drugiej strony, zmienna referencyjna jest aliasem dla innej zmiennej, tym samym przyjmując adres zmiennej referencyjnej.

  1. Wartość NULL dla wskaźnika i odwołania

- NULL reprezentuje koniec listy, co oznacza, że ​​wskazuje na nieznaną wartość i określa, że ​​zmienna nie ma poprawnej przestrzeni adresowej. Wartość NULL można przypisać bezpośrednio do zmiennej wskaźnika, co sugeruje, że nie jest ona nigdzie wskazywana, natomiast wartości NULL nie można przypisać do zmiennej referencyjnej.

Wskaźnik a referencja: tabela porównawcza

Podsumowanie wskaźnika a referencja

Wskaźniki zawsze były jednym z ulubionych tematów dyskusji programistów C / C ++, dopóki nie pojawiły się odnośniki. Referencje są w pewnym sensie podobne do wskaźników, ale mają w porównaniu do nich sporo zalet i wad. Podczas gdy oba mogą być używane do zmiany lokalnych zmiennych jednej funkcji w ramach innej funkcji, mają one swoje różnice. Obie są potężnymi funkcjami w C i C ++, które umożliwiają bezpośrednią manipulację pamięcią, ale z kilkoma wyjątkami. Wskaźnik zawiera adres pamięci zmiennej, podczas gdy odniesienie jest po prostu aliasem dla innej zmiennej.