Różnica między *&g a *g

0

Jak w temacie. Pytanie moje wynika z tego, iż pisząc program sprawdziłem obie wersje i poprawanie działa jedynie dla *&g oto fragment kodu funkcja:

void wpisz_do_tablicy(Sodcinek *&g)
{
    g= new Sodcinek[n];
    for(int i=0; i<n; i++)
    {
        cout<<"Wpisz x poczatku i y poczatku odcinka"<<endl;
        cin>>g[i].A.x>>g[i].A.y;
        cout<<"Wpisz x konca i y konca odcinka"<<endl;
        cin>>g[i].B.x>>g[i].B.y;
        cout<<endl;
    }
}
0

Sodcinek* - wskaźnik na Sodcinek (przekazany przez wartość jako kopia, którą podmieniasz w funkcji)
Sodcinek*& - referencja do wskaźnika na Sodcinek (w funkcji ustawiasz wartość oryginalnego wskaźnika)

1

No skoro chcesz zmodyfikować wskaźnik, który przekazujesz do funkcji (tzn nie to na co wskazuje, ale sam wskaźnik), to musisz mieć albo podwójny wskaźnik albo referencję do wskaźnika. Wskaźnik to tylko adres, kiedy przekazujesz go do funkcji adres ten (liczba) jest kopiowany. Jeżeli zmienisz go wewnątrz, zmienisz tylko tą lokalną kopię.

0

Acha czyli w tej funkcji, którą napisałem, jeśli bym użył *g bez & to odnosiłbym się do tego na co pokazuje ten wskaźnik, a funkcja stworzyłaby sobie kopie tego czegoś. A potem gdy funkcja kończy działanie to to na co pokazuje wskaźnik pozostaje takie jakie było przed działaniem funkcji. Oto chodzi?

1

jeśli bym użył *g bez & to odnosiłbym się do tego na co pokazuje ten wskaźnik, a funkcja stworzyłaby sobie kopie tego czegoś.

Nie. jeśli przekazujesz Sodcinek*, to możesz zmienić „wskazywane coś”, ale nie możesz podmienić samego wskaźnika na coś innego (tzn. możesz, ale na zewnątrz funkcji nie odniesie to skutku).
Jeśli przekazujesz Sodcinek*&, to możesz zmienić zarówno „wskazywane coś”, jak i samą wartość wskaźnika, i podmiana będzie miała skutek na zewnątrz.

Kopia „tego czegoś” nie jest ani w jednym ani w drugim przypadku tworzona. W pierwszym przypadku tworzona jest kopia wskaźnika.

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