#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;
}
Adres na jaki wskazuje wskaźnik vs wartość wyłuskana spod adresu, na jaki wskazuje wskaźnik.
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 ?
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
*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.