Czym się roznią te zapisy (wskazniki)

0
 
#include <iostream>

using namespace std;

int main()
{
   int a=5;
   int * w;
   //w=&a;               Oba pokazuja to samo przeciez ;
   //*w=a;
    cout << *w;
   return 0;
}
1

Adres na jaki wskazuje wskaźnik vs wartość wyłuskana spod adresu, na jaki wskazuje wskaźnik.

0

W obu przypadkach jak wyrzuce to na ekran to pokazuje mi wartosc = 5 a nie zaden adres .
Czyli te dwa zapisy sa prawidlowe i pokazuja to samo ?

1

Jednakże zapisy robią różne rzeczy - w przypadku przypisania wartości do niezainicjowanego wskaźnika mażesz po śmieciach - w efekcie występuje tutaj UB - najprawdopodobniejszym wynikiem jest błąd wykonania - access violation

5
*w = a;

to jest niepoprawny kod, który może się kończyć ubiciem programu.
Żeby to zrozumieć musisz przede wszystkim zrozumieć czym jest wskaźnik. Wskaźnik to zmienna, której wartość to jest jakiś adres.

int* w;

deklaruje taką zmienną z losową wartością.

*w = a;

pod tym losowym adresem zapisuje jakąś wartość. Ale pamięć pod tym adresem nie należy do Ciebie!

Żeby było poprawnie należy najpierw alokować pamięć i przypisać adres tej pamięci do tego wskaźnika

int* w = new int;
*w = a;

Można od razu zauważyć, że to co jest pod tym adresem ma taką samą wartość jak zmienna a, ale na tym się podobieństwa kończą. Modyfikacja dowolnej z nich nie zmienia drugiej zmiennej.

int* w = new int;
*w = a;
*w = -1;   // a nadal ma starą wartość 5

Natomiast drugi wariant mówi, że w to wskaźnik, który wskazuje na adres, pod którym jest zmienna a.

int* w = &a;
*w = -2   // a teraz ma wartość -2

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.