• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Operator 'new' vs adres pamięci wskaźnika

Object Storage Arubacloud
0 głosów
216 wizyt
pytanie zadane 3 listopada 2016 w C i C++ przez Tinsonu Początkujący (280 p.)

Witam

Proszę o pomoc w zrozumieniu mechanizmu ustalającego adres wskaźnika. W standardowym sposobie inicjalizacji wskaźnika (bez użycia operatora 'new') adres pod którym znajduje się wartość przypisana do zmiennej jest ustalana za pomocą 'ampersanda' np.: &nazwazmiennej. I to jest jasne i klarowne.

Natomiast (jeśli dobrze rozumiem) przy użyciu operatora 'new' adres jest ustalany i przypisywany z automatu do zarezerwowanej pamięci, bez konieczności użycia 'ampersanda' i to też rozumiem.

Jednak nie wiem dlaczego przy automatycznym rezerwowaniu pamięci (new), sprawdzając adres zarezerwowanej pamięci poprzez cout << pd ...  (patrz zamieszczony poniżej przykład /wskaźnik 'double*pd'/)  otrzymuję inny adres niż używając 'ampersanda' &pd.

Mam nadzieję, że wyraziłem sie w miarę jasno.

int main()
{
    using namespace std;
    int nights = 1001;
    int * pt = new int;         // alokacja pamięci na wartość int
    *pt = 1001;                 // zapis tam wartości

    cout << "wartosc nights = ";
    cout << nights << ": polozenie " << &nights << endl;
    cout << "int ";
    cout << "wartosc = " << *pt << ": polozenie = " << pt << endl;

    double * pd = new double;   // alokacja pamięci na wartość double
    *pd = 10000001.0;           // zapis tam wartości

    cout << "double: ";
    cout << "wartosc = " << *pd << ": polozenie = " << pd << endl;
    cout << "polozenie wskaznika pd: " << &pd << endl;  // dlaczego to jest różne od wartości z wiersza powyżej !!!!
    cout << "wielkosc pt = " << sizeof(pt);
    cout << ": wielkosc *pt = " << sizeof(*pt) << endl;
    cout << "wielkosc pd = " << sizeof pd;
    cout << ": wielkosc *pd = " << sizeof(*pd) << endl;
    return 0;
}

 

 

 

2 odpowiedzi

+2 głosów
odpowiedź 3 listopada 2016 przez easytodo Mądrala (5,380 p.)

Wskaźnik to też zmienna, która jest przechowywana w pamięci pod swoim własnym adresem. Tak więc:

cout << pd; Wyświetli adres, NA KTÓRY wskazuje wskaźnik
cout << &pd; Wyświetli adres, POD KTÓRYM znajduje się sam wskaźnik.

Mam nadzieję że w miarę pomogłem, jeżeli chciałbyś dowiedzieć się więcej to pisz śmiało, pomogę w miarę możliwości :)

komentarz 3 listopada 2016 przez Tinsonu Początkujący (280 p.)
Czyli:

cout << pd; - wyświetla adres pod którym 'new' zarezerwowało miejsce dla przyszłej wartości wskaźnika '*pd' (czyli pod jakim adresem będzie/jest zapisana wartość 10000001) ???

cout << &pd; wyświetla adres pod jakim znajduje się '*pd' ???

double * pd = new double;   // alokacja pamięci na wartość double
 *pd = 10000001.0;           // zapis tam wartości
1
komentarz 3 listopada 2016 przez easytodo Mądrala (5,380 p.)

cout << pd; - wyświetla adres pod którym 'new' zarezerwowało miejsce dla przyszłej wartości wskaźnika '*pd' (czyli pod jakim adresem będzie/jest zapisana wartość 10000001) ???

 Dokładnie.

cout << &pd; wyświetla adres pod jakim znajduje się '*pd' ???

Nie. Spójrz:

double *pd = new double;
*pd = 1000;

1 linijka: deklaracja wskaźnika i alokacja pamięci przy pomocy instrukcji new. Na tym etapie:
cout << pd; - wyświetla adres, który zaalokował nam operator new.
cout << &pd; - wyświetla adres wskaźnika pd.

Gdybyś miał zmienną:
int a;
a = 5;

I wykonał operację:
cout << a; 

To wyświetli się 5, natomiast przy wpisaniu:
cout << &a;

Otrzymasz adres zmiennej a. Dokładnie tak samo jest ze wskaźnikiem. Nasze 'a' przechowuje wartości integer, natomiast wskaźnik przechowuje adresy pamięci, czyli w przypadku 'a' wartość to 5, a w przypadku wskaźnika jego wartość to adres innej zmiennej.
Tak więc przy wpisaniu:
cout << &pd; 
Otrzymasz adres wskaźnika, który powtarzam, także jest zmienną i ma własne miejsce w pamięci a to, co przechowuje to adres innej zmiennej i może (a nawet musi) być on inny niż adres wskaźnika.

Natomiast wpisując:
cout << *pd;
Otrzymasz wartość zmiennej, na którą wskaźnik wskazuje. (Nie wartość samego wskaźnika, bo wartością wskaźnika jest adres tej właśnie zmiennej, której wartość wyświetlamy).

komentarz 4 listopada 2016 przez Tinsonu Początkujący (280 p.)
Ok. Chyba rozumiem.

cout << *pd; - wyświetli wartość (1000) zmiennej wskaźnikowej '*pd'. Wyświetlenie będzie możliwe dzięki temu, że wskaźnik wskazuje na adres, który został wcześniej określony przez operator 'new'

cout << pd; - spowoduje wyświetlenie tego co wskaźnik 'pd' przechowuje w pamięci, czyli adresu pod którym zapisana jest wartość zmiennej wskaźnikowej '*pd'.

cout << &pd; - wyświetli adres komórki pod którą wskaźnik 'pd' przechowuje adres komórki, gdzie zapisano wartość zmiennej wskaźnikowej '*pd'.

 Czy tak?
komentarz 4 listopada 2016 przez easytodo Mądrala (5,380 p.)

cout << &pd; - wyświetli adres komórki pod którą wskaźnik 'pd' przechowuje adres komórki, gdzie zapisano wartość zmiennej wskaźnikowej '*pd'.

Prościej - wyświetla adres komórki, w której znajduje się zmienna wskaźnikowa, czyli wyświetla adres wskaźnika :)

komentarz 5 listopada 2016 przez Tinsonu Początkujący (280 p.)
Poniżej mała 'symulacja' do Twojego przykładu - popraw mnie jeśli nadal coś będę mylił.

adres    zmienna/obiekt    wartość komórki pamięci

0004     

0006              pd                     0108

.......            .......                    .......

0108        obiekt(new)              1000

xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

cout<< *pd; // wyświetli wartość 1000, bo: jako zmienna wskaźnikowa przechowuje adres (0108) do komórki zarezerwowanej wcześniej przez operator 'new'

cout<< pd // wyświetli 0108, czyli adres na jaki wskazuje

cout<<&pd // wyświetli 0006, czyli adres pod jakim jest zapisany wskaźnik pd.
komentarz 5 listopada 2016 przez easytodo Mądrala (5,380 p.)
Wszystko zilustrowałeś poprawnie :)
0 głosów
odpowiedź 3 listopada 2016 przez Ehlert Ekspert (212,670 p.)
int u = 5;
//u wartość zmiennej 
//&u adres zmiennej 
int * ptr = &u;
//ptr to adres na który wskazuje wskaźnik czyli &u
//*ptr to wartość tego na co wskazuje czyli u, 5
//&ptr to adres wskaźnika czy nic związanego z u. Pozornie. 

 

Podobne pytania

0 głosów
1 odpowiedź 216 wizyt
pytanie zadane 19 kwietnia 2017 w C i C++ przez mo290103 Obywatel (1,860 p.)
0 głosów
2 odpowiedzi 1,261 wizyt
pytanie zadane 8 marca 2018 w C i C++ przez Hiskiel Pasjonat (22,830 p.)

92,579 zapytań

141,432 odpowiedzi

319,662 komentarzy

61,963 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...