Różnica między stosowaniem "new" a stosowaniem przedrostka "&"

0

Tak jak w temacie. Wiem do czego służy słowo kluczowe "new". Przydziela on do zmiennej wskaźnikowej obszar pamięci i zwraca adres tego obszaru.

Nie rozumiem jednak jak mam zatem widzieć np. coś takiego pPointer= &coś; Przecież zapis &coś zwraca mi w efekcie adres mojego cosia, czy nie tak?

No to czym różni się np. "new int;"

od takiego czegoś:

int coś=0;
int *pPointer;
pPointer=&coś;

?

0

& to operator pobrania adresu. Używa się go do już istniejących zmiennych. Natomiast new zwraca adres nowego, dynamicznie przydzielonego (czyli w czasie działania programu) obszaru pamięci.

0

new zwraca ci adres do nowego obszaru pamięci, który został ci właśnie przydzielony, a operator ampersandu daje adres już istniejącego obiektu. To jest ta różnica, z resztą jak sam zauważyłeś.
To, dlaczego inicjując wskaźnik stosujemy czasem new, a czasem pobieramy adres istniejącego obiektu zależy np. od sposobu alokacji tej pamięci. W przykładzie powyżej pamięć pod zmienną coś została automatycznie zaalkowana na stosie. Jest on po pierwsze ograniczony pojemnością, a po drugie, kawałek stosu należący do tej konkretnej funkcji przestanie istnieć po jej zakończeniu. Dlatego niektóre obiekty / zmienne chcemy trzymać na stercie - dużej, wspólnej przestrzeni na dane w obrębie całego programu. I po to jest nam potrzebny new.

0
michal_2 napisał(a):

& to operator pobrania adresu. Używa się go do już istniejących zmiennych. Natomiast new zwraca adres nowego, dynamicznie przydzielonego (czyli w czasie działania programu) obszaru pamięci.

Tzn. tak: mam zmienną np "int a" oraz "&a" i owy ->&<- pobiera adres zmiennej a. Ok. I to jest jeszcze przed uruchomieniem programu.

Natomiast new przydziela obszar pamięci oraz zwraca jego adres dopiero po uruchomieniu?? Czy o to chodzi?

0

Dobra, słuchajcie...to reasumując.

Ten przedrostek "&" zwraca adres np. &coś <- mojego cosia. Jednak kiełbasi mi się to ze słowem "new" dlatego, że zmienna "coś" również jest nową zmienną i również tak jakby zostaje jej przydzielony pewien NOWY obszar pamięci.

Przestaje natomiast mi się to wszystko kiełbasić, gdy rozróżnię dwie osobne sprawy: stos i stertę. Tamto z cosiem rozumiem, że dotyczy stosu. Natomiast new rozumiem, że dotyczy sterty oraz przydzielenia na stercie konkretnego nowego obszaru pamięci.

Tak to właśnie widzę.

0

[Cholera, sorry, wysłało za wcześnie]

Źle widzisz.

struct Zuo {
  int zue;
  int zuo;
};

int main() {
    Zuo *zuo = new Zuo();
    int &wtf = &zuo->zue; // stos czy sterta?
}
0

Ekhm, miał byś wskaźnik, nie referencja...

int *wtf = &zuo->zue; // stos czy sterta?
2
int main()
{
    Zuo zua; // obiekt stworzony na stosie
    Zuo *zui; // wskaźnik na stosie
    Zuo *zuu = new Zuo(); // wskaźnik na stosie, obiekt stworzony na stercie
    Zuo *zue = &zua; // wskaźnik na stosie, istniejący obiekt na stosie
    Zuo *zuo = zuu; // wskaźnik na stosie, istniejący obiekt na stercie

    delete zuu;
}

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