Różnica między wskaźnikiem a odniesieniem

Różnica między wskaźnikiem a odniesieniem

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

Obie są zmiennymi, które są używane w odniesieniu do innych obiektów pośrednio i mają niektóre wspólne cechy na powierzchni. Chociaż mają wiele wspólnych możliwości, są również bardzo złożone do zrozumienia.

Wskaźnik jest zmienną, która utrzymuje adres pamięci innej zmiennej, podczas gdy odniesienie jest jak wskaźnik, którego można użyć do pośrednicznego odwołania się do innej zmiennej.

Większość programistów wydaje się rozwijać pewne zrozumienie, kiedy używać wskazówek i kiedy używać referencji, ale często spotykają się z problemami, których rozwiązanie wydaje się niejasne.

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

Co to jest wskaźnik?

Każda zmienna to lokalizacja pamięci, która jest zdefiniowana przez jej adres i jest sparowana z identyfikatorem, który zawiera pewną wartość, która może zostać zmieniona w trakcie programu. Mówiąc prosto, zmienna jest symbolem reprezentującym ilość.

Wskaźnik to zmienna, która zawiera adres pamięci innej zmiennej. Wskaźnik to tylko adres i zmienna, która przechowuje wskaźnik, nazywa się zmienną wskaźnika.

Chodzi o to, aby używać identyfikatorów (lub nazw) zamiast adresów liczbowych, aby złagodzić ciężar programowania. Ponieważ adresy te odnoszą się do rzeczywistych lokalizacji w pamięci komputera, wskaźniki mogą być używane do dostępu i manipulowania treś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 należące do osobnego typu danych, należy je zadeklarować za pomocą wskazówek, zanim będziesz mógł z nimi pracować. Ogólna forma deklaracji wskaźnika jest:

Data_type * var-name;

Tutaj „data_type” to podstawowy typ wskaźnika, a „var-nazwa” to zmienna wskaźnika. Asterisk (*) tutaj służy do deklarowania wskaźnika, który wyznacza zmienną „var-name” jako zmienną wskaźnika.

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

float *x; // Wskaźnik pływakowy

Tutaj zmienna „P” wskazuje na typ danych liczb całkowitych, który jest deklarowany jako „int”, który odnosi się do rodzaju danych zmiennej. Podobnie w drugim przykładzie „pływak” odnosi się do rodzaju danych zmiennej „x”, która w rzeczywistości jest oznaczona jako wskaźnik do zmiennej zmiennoprzecinkowej.

Co to jest odniesienie?

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

Umożliwia programistom utworzenie drugiej nazwy zmiennej, której mogą użyć do manipulowania treścią przechowywaną w tej zmiennej. Jest to byt, który jest aliasem dla innej zmiennej i ma ten sam adres co oryginalna zmienna. Obsługuje podanie działające jako parametry formalne funkcji, a po zdefiniowaniu odwołania się do zmiennej nie można go poddać, co oznacza, że ​​nie można go odnieść do innej zmiennej.

W przeciwieństwie do wskazówek, nie potrzebują operatora dereferencji, aby uzyskać dostęp do wartości; W rzeczywistości można je stosować jak zmienne normalne.

int i;

int & ri = i;

Tutaj „RI” jest odniesieniem do całkowitego zainicjowanego do „I”. Deklaruje „RI” jako obiekt typu „Odniesienie do INT”. Odniesienie można łatwo pomylić z 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 odniesieniem

  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 to tylko zmienna, która przechowuje adres pamięci innej zmiennej, podczas gdy odniesienie jest jak alias dla już istniejącej zmiennej. Tworzy drugą nazwę zmiennej, której można użyć do modyfikacji treści przechowywanej w tej zmiennej.

  1. Deklaracja wskaźnika i odniesienia

- Wskaźnik jest jak każda inna zmienna, która przechowuje kawałek danych. W przeciwieństwie do innych zmiennych, zmienne wskaźników przechowują adresy pamięci zamiast wartości. Wskaźnik jest dereferencyjny za pomocą operatora pośredniego * w celu uzyskania dostępu do lokalizacji pamięci zmiennej, na którą wskazuje. Z drugiej strony odniesienie nie wymaga żadnego operatora dereferencji, aby uzyskać dostęp do wartości.

  1. Ponowne wspomnienie wskaźnika i odniesienia

- W przeciwieństwie do wskazówek, które można zainicjować w dowolnym momencie, odniesienia należy przypisać podczas inicjalizacji. Wskaźniki można uzyskać bezpośrednio, podczas gdy referencje nie można bezpośrednio uzyskać.

  1. Adres pamięci wskaźnika i odniesienia

- Zmienna wskaźnika ma własną lokalizację w pamięci, co oznacza, że ​​gdy zadeklarujesz wskaźnik, określasz 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 zapisywana w pamięci. Z drugiej strony zmienna odniesienia jest aliasem dla innej zmiennej, biorąc w ten sposób adres zmiennej odniesienia.

  1. Wartość null dla wskaźnika i odniesienia

- NULL reprezentuje koniec listy, co oznacza, że ​​wskazuje, że wartość jest nieznana i określa, że ​​zmienna nie ma prawidłowego miejsca adresu. Wartość zerową można przypisać bezpośrednio do zmiennej wskaźnika, co sugeruje, że nigdzie nie wskazuje, podczas gdy NULL nie można przypisać do zmiennej odniesienia.

Wskaźnik vs. Odniesienie: wykres porównawczy

Podsumowanie wskaźnika vs. Odniesienie

Wskaźniki zawsze były jednym z ulubionych tematów dyskusji na temat programistów C/C ++, dopóki nie pojawiły się odniesienia do obrazu. Odniesienia są nieco podobne do wskazówek, ale w porównaniu z tym, że mają spory udział w zależnościach i wadach. Chociaż oba można użyć do zmiany zmiennych lokalnych jednej funkcji w ramach innej funkcji, mają swoje różnice. Oba są potężnymi funkcjami w C i C ++, które pozwalają bezpośrednio manipulować pamięcią, ale z kilkoma wyjątkami. Wskaźnik przechowuje adres pamięci zmiennej, podczas gdy odniesienie to tylko alias dla innej zmiennej.