Zarówno wskaźniki, jak i odniesienia 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ą.
Obie są zmiennymi, które są używane do pośredniego odniesienia 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 odwołanie jest jak wskaźnik, którego można użyć do pośredniego odniesienia do innej zmiennej.
Wydaje się, że większość programistów rozumie, kiedy używać wskaźników i kiedy używać referencji, ale często napotykają problemy, których rozwiązanie wydaje się niejasne.
Aby lepiej zrozumieć filozofię, zrozummy różnicę między nimi.
Każda zmienna jest miejscem w pamięci, które jest zdefiniowane przez jej adres i jest sparowane z identyfikatorem, który zawiera pewną wartość, którą można zmienić w trakcie programu. Mówiąc prościej, zmienna jest symbolem reprezentującym ilość.
Wskaźnik to zmienna zawierająca adres pamięci innej zmiennej. Wskaźnik to nic innego jak adres, a zmienna przechowująca wskaźnik nazywa się zmienną wskaźnika.
Chodzi o użycie identyfikatorów (lub nazw) zamiast adresów numerycznych, aby zmniejszyć obciążenie związane z programowaniem, a tym samym zmniejszyć złożoność programów. Ponieważ adresy te odnoszą się do rzeczywistych lokalizacji w pamięci komputera, wskaźniki mogą służyć do uzyskiwania dostępu do zawartości przechowywanej w pamięci i manipulowania nią.
Jak każda zmienna lub stała wskaźniki muszą być zadeklarowane dla ich typów. Ponieważ wskaźniki zawierają adresy pamięci należące do osobnego typu danych, należy je zadeklarować za pomocą wskaźników, zanim będzie można z nimi pracować. Ogólna forma deklaracji wskaźnika to:
Typ danych * nazwa-zmiennej;
W tym przypadku „typ_danych” jest podstawowym typem wskaźnika, a „nazwa-zmiennej” jest zmienną wskaźnika. Gwiazdka (*) tutaj służy do deklarowania wskaźnika, który określa zmienną „nazwa-zmiennej” jako zmienną wskaźnika.
int * p; // wskaźnik liczby całkowitej
float * x; // wskaźnik zmiennoprzecinkowy
W tym przypadku zmienna „p” wskazuje na całkowity typ danych zadeklarowany jako „int”, który odnosi się do typu danych zmiennej. Podobnie w drugim przykładzie „liczba zmiennoprzecinkowa” odnosi się do typu danych zmiennej „x”, która w rzeczywistości jest wyznaczona jako wskaźnik do zmiennej zmiennoprzecinkowej.
Odwołanie jest jak wskaźnik z pośrednim dostępem do zmiennej. To jest jak alias dla innej zmiennej, co oznacza, że jest to po prostu inna nazwa dla już istniejącej zmiennej.
Pozwala programistom stworzyć drugą nazwę dla zmiennej, której mogą używać do manipulowania zawartością przechowywaną w tej zmiennej. Jest to encja, która jest aliasem innej zmiennej i ma taki sam adres jak zmienna oryginalna. Obsługuje przekazywanie przez odniesienie działające jako parametry formalne funkcji, a gdy zdefiniuje się, że odnosi się do zmiennej, nie można go ponownie ustawić, co oznacza, że nie można go odnieść do innej zmiennej.
W przeciwieństwie do wskaźników nie potrzebują operatora dereferencji, aby uzyskać dostęp do wartości; w rzeczywistości można ich używać jak normalne zmienne.
int i;
int & ri = i;
„Ri” jest tutaj całkowitą referencją zainicjowaną na „i”. Deklaruje „ri” jako obiekt typu „odniesienie do int”. Odwołanie można łatwo pomylić ze wskaźnikiem, który jest niezależną zmienną, której wartości adresu nie można ponownie przypisać po utworzeniu.
- Oba zapewniają prawie podobne możliwości pod względem użyteczności, a rozróżnienie może być trudne. Wskaźnik jest tylko zmienną, która przechowuje adres pamięci innej zmiennej, podczas gdy odwołanie jest jak alias dla już istniejącej zmiennej. Tworzy drugą nazwę dla zmiennej, której można używać do modyfikowania zawartości przechowywanej w tej zmiennej.
- 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 odsyłany za pomocą operatora pośredniego *, aby uzyskać dostęp do lokalizacji pamięci zmiennej, na którą wskazuje. Z drugiej strony odwołanie nie wymaga operatora dereferencji, aby uzyskać dostęp do wartości.
- W przeciwieństwie do wskaźników, które można zainicjować w dowolnym momencie, odniesienia należy przypisać przy inicjalizacji. Wskaźniki są dostępne bezpośrednio, natomiast odniesienia nie są dostępne bezpośrednio.
- Zmienna wskaźnikowa 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 wskaźnikowa ma ten sam adres, pod którym jest zapisana w pamięci. Z drugiej strony zmienna referencyjna jest aliasem innej zmiennej, tym samym przyjmując adres zmiennej referencyjnej.
- NULL reprezentuje koniec listy, co oznacza, że wartość jest nieznana i określa, że zmienna nie ma prawidłowej przestrzeni adresowej. Wartość NULL można przypisać bezpośrednio do zmiennej wskaźnikowej, co sugeruje, że nigdzie nie wskazuje, natomiast wartości NULL nie można przypisać do zmiennej odniesienia.
Wskaźniki zawsze były jednym z ulubionych tematów dyskusji programistów C / C ++, dopóki nie pojawiły się odniesienia. Referencje są nieco podobne do wskaźników, ale w porównaniu z nimi mają swój dobry argument za i przeciw. Oba mogą być używane do zmiany lokalnych zmiennych jednej funkcji w innej funkcji, ale mają swoje różnice. Obie 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 odwołanie jest tylko aliasem innej zmiennej.