przypisanie adresu zmiennej do wskaźnika-wyjaśnienie

0

Witam. Mam taki o to kod:

#include <iostream>
using namespace std;
int main(){
	typedef unsigned short int USHORT;
	USHORT myAge;//zmienna
	USHORT *pAge=0;//wskaznik
	myAge=5;
	
	cout<<"myAge: "<<myAge<<endl;
	pAge=&myAge;
	cout<<"*pAge: "<<*pAge<<endl<<endl;
	
	cout<<"Ustawiam *pAge=7..."<<endl;
	*pAge=7;
	cout<<"*pAge: "<<*pAge<<endl;
	cout<<"myAge: "<<myAge<<endl<<endl;
	
	cout<<"Ustawiam myAge = 9..."<<endl;
	myAge=9;
	cout<<"myAge: "<<myAge<<endl;
	cout<<"*pAge: "<<*pAge<<endl;
	return 0;
}

I rozchodzi mi się o linijkę: pAge=&myAge;
Dlaczego nie *pAge=&myAge?
Wprawdzie wcześniej został zainicjalizowany wskaźnik *Age=0;
Ale odpowiedni efekt również by dało rozwiązanie: USHORT * pAge=&myAge;
Więc czemu nie może być **pAge=&myAge;*, tylko musi być to bez gwiazdki?
pAge bez gwiazdki wygląda jak zwykła zmienna, a nie wskaźnik którym ma być.
Tak jakby do jednej zmiennej był przypisany adres innej zmiennej, a nie do wskaźnika który ma wskazywać na tą drugą zmienną.
Nie wiem czy dobrze wytłumaczyłem o co mi chodzi. Trochę się pogubiłem w tym temacie z wskaźnikami i adresami.
Mam nadzieję, że udało mi się odpowiednio nazwać wątek, i nie wyląduje w koszu.

1

Źle na to patrzysz. Patrz na to tak:

int* zmienna;

i tutaj to "int*" jest typem zmiennej. Nie jest to absolutnie poprawne ze względu na składnię C/C++ ale jest to najbardziej sensowne wyjaśnienie.
W związku z tym jesli przypisujesz wartość danemu wskaźnikowi to robisz to tak samo jak z przypisaniem wartości dowolnej innej zmiennej, czyli poprzez nazwa=wartość.

Tak jakby do jednej zmiennej był przypisany adres innej zmiennej

I dokładnie to się dzieje. Wskaźnik to zwykła zmienna. Zwykle unsigned int ;)

Rozgranicz też dwa konteksty uzycia gwiazdki. Jeden to deklaracja zmiennej czyli np.:

int* wskaznik;

a drugi to operowanie na wskaźniku np.:

*wskaznik = 10;

To są zupełnie różne sytuacje!
Operator * na wskaźniku to operator dereferencji (wszędzie poza pierwszą deklaracja wskaźnika), czyli operator odwołania się do pamięci na którą wskaźnik pokazuje.
*pAge oznacza: "odczytaj adres zapisany w zmiennej pAge a następnie odwołaj się do komórki pamięci pod tym adresem".

0

Tak obserwując ten kod, to w sumie wychodzi, że jak wskaźnik już jest zainicjalizowany na poczatku, to później do podstawienia adresu nie potrzebna jest gwiazdka, tylko wtedy gdy chcemy zmienić wartość zmiennej do ktorej wskaźnik się odwołuje. Może zapamiętam taki schemat.

0

Zamień:

USHORT *pAge=0;

na te dwie:

typedef USHORT *PUSHORT;
PUSHORT pAge=0;

Zauważ że ta gwiazdka należy do typu (jest częścią typu).
Więc zawsze jak chcemy zmienić/ustawić adres to używamy bez gwiazdki.

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