Porównaj ceny domen i usług IT, sprzedawców z całego świata

Łącze wskaźnika


char *str = "Hello";char *ptr = str;
char *&rptr = str;

Jaka jest różnica między ptr i rptr? Rozumiem, że rptr jest odniesieniem do wskaźnika (w teorii), ale czym różni się pod względem implementacji z ptr?
Czy odwołania w C ++ są zaimplementowane przy użyciu wskaźników?
Zaproszony:
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Jaka jest różnica między ptr i rptr?

Jeśli wykonasz
char * world = "World"; rptr = world;
a następnie wpiszesz
str
, wyświetli się „World”. Jeśli wykonasz
ptr = world;
, a następnie wydrukujesz
str
, wyświetli się „Hello”.
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:


str

przechowuje adres (i dlatego wskazuje) na literał „Hello”, który jest przechowywany gdzieś w segmencie pamięci tylko do odczytu.

ptr

wskazuje na ten sam adres, co „str”.

rptr

zasadniczo wskazuje na „str” (nie ten sam punkt co str, ale sam str). Używanie `` wskazuje na '' dla łączy może być niezwykłe, ale w rzeczywistości są one bardzo podobne do samych wskaźników (w tym przypadku wskaźnika do wskaźnika), z wyjątkiem drobnych różnic składniowych i ograniczenia, że ​​nie mogą wskazywać na żaden inny adres za życia.
Byłoby podobnie:
char** const rptr = &str;

Podobnie jak w przypadku linku, powyższemu rptr nie można przypisać nowego adresu (nie może zmienić tego, na co wskazuje), ale można dowolnie zmienić swój wskaźnik (w tym przypadku jest to wskaźnik na „str”).
*rptr = 0;// after this, str == 0

Referencje są prawie takie same jak wskaźnik tylko do odczytu (nie jest to zmienny wskaźnik do wskaźnika tylko do odczytu), ale nie wymagają wyłuskiwania instrukcji, aby uzyskać wskaźnik (dane referencyjne):
char *str = "Hello";
char *&rptr = str;
rptr = 0;// after this, str == 0

Jedyna różnica między powyższym wskaźnikiem tylko do odczytu a przykładem wskaźnika polega na tym, że nie musieliśmy używać operatora *.
Odniesienia do stałych mają również unikalną właściwość wydłużania czasu życia obiektów tymczasowych, ale prawdopodobnie wykracza to poza zakres dyskusji.
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Spróbuj:
#include <iostream>
int main () {
char *str1 = "Hello ";
char *str2 = "World!";
char *ptr = str1;
char *&rptr = str1;
rptr = str2;
std::cout << ptr << str1 << std::endl;
}

Wyświetla „Hello world!” Ponieważ
ptr
jest wskaźnikiem znaków wskazującym na literał ciągu „Hello”.
rptr
jest odniesieniem do wskaźnika char, więc kiedy go zmienisz (wskaźnik, a nie to, na co wskazuje.), zmieniasz
str1
. I tak
ptr
wskazuje na „Hello”.
str1
wskazuje na „World!”

Aby odpowiedzieć na pytania, Zaloguj się lub Zarejestruj się