Róznica między wskaźnikiem a referencją

0

Zastanawia mnie jedna rzecz: jaka jest różnica poza składnią między referencją a wskaźnikiem w języku C++? W zasadzie poza składanią uzyskujemy taki sam efekt, używając referencji modyfikujemy zmienną, która jest gdzieś w pamięci, tyle że składnie mamy prostszą tak jakby przekazywać zmienną przez wartość.

Czym właściwie jest ta tajemnicza referencja? Bo wskaźnik to zmienna, której wartość wskazuje na jakiś adres. I za pomocą specjalnego operatora można uzyskać wartość zmiennej pod tym adresem.

0

Spróbuj przy pomocy referencji zarejestrować dynamiczną tablicę (bez użycia wskaźników) to Ci się wszystko i więcej wyjasni :)

2

Referencja jest praktycznie stałym wskaźnikiem (nie mylić ze wskaźnikiem do stałej wartości), tzn. nie da się zmienić miejsca w pamięci na który wskazuje, oraz nie może być nullem. Dodatkowo składnia jest identyczna jak posługiwanie się zmiennymi zaalokowanymi na stosie, co dodatkowo lepiej przekazuje intencję programisty. Przekazywanie argumentów funkcji przez referencję (z atrybutem const kiedy można) jest preferowanym sposobem przekazywania wszystkich obiektów, praktycznie umożliwia programowanie obiektowe. Dodatkowo wydaje mi się, że referencje pozwalają na więcej optymalizacji kompilatora niż wskaźniki (jak ktoś wie na ten temat coś więcej to proszę o wypowiedzenie się).

0

Tak jak powiedziałeś wskaźniki to zmienne mogące trzymać adres, a referencja to adres do czegoś tam nie będący L-Wartością.

0

Dzięki.

1

Z praktycznego punktu widzenia referencje w C++ to to samo co wskaźniki tylko pozwalają na bardziej zwięzły zapis i nie udostępniają arytmetyki (bo i tak są przecież stałymi).

Const correctness obecnie bardziej przydaje się do eliminowania błędów w kodzie niż do pomocy kompilatorowi w optymalizacji, tzn rzadko kiedy dodanie constów tu i tam zwiększa wydajność. Nowoczesne kompilatory raczej analizują kod do takiego stopnia, że same mogłyby powstawiać consty tam gdzie można.

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0