Adres wskaźnika mały problem

0

Cześć chłopaki, mam jeden problem

int zmienna;
int* wsk = &zmienna; // ustawienie wsk na zmiennna

cout << wsk << endl; // adres zmiennej na ktora pokazuje wskaznik
cout << &wsk << endl;// adres samego wskaznika

char* wsk2= new char [20];
cout << wsk2 << endl; // wyswietlenie tablicy
cout << (int*)wsk2 << endl; // wyswietlenie adresu tablicy
cout << (int)wsk2 << endl; // jakis numer, co to za numer  ????????? czemu przy rzutowaniu musi byc znak wyluskajacy wartosc wskaznika?
delete [] wsk2;
// jak uzyskac adres wskaznika pokazujacego na powyzsza tablice? 

(int)wsk2 << endl; pokazuje jakiś numer, czemu przy rzutowaniu musi być znak wyluskajacy wartosc wskaznika?

2

czemu przy rzutowaniu musi być znak wyluskajacy wartosc wskaznika?

Asteriks * jako operator jest odpowiedzialny za dereferencję, a nie za wyłuskiwanie. Asteriks razem z typem int* oznacza, że zmienna jest wskaźnikiem danego typu, nie następuje tu żadne wyłuskiwanie ani dereferencja. Czyli zapis (int*)wsk2 oznacza rzutowanie na typ wskaźnikowoy.

(int)wsk2 << endl; // jakis numer, co to za numer

Nie powinno Ci się to skompilować na w miarę współczesnym kompilatorze, bo typ wskaźnikowy char* nie można zrzutować na prosty int.

EDIT
W sensie można, tak jak napisał @TomaszLiMoon niżej, ale int może nie pomieścić zawartości wskaźnika dlatego domyślnie powinieneś mieć błąd.

2

Instrukcja

cout << (int)wsk2 << endl

próbuje wykonać konwersję typu wskaźnika ( prawdopodobnie na przykład o rozmiarze 4 bajtowym ) do typu int ( o rozmiarze 4 bajtów ). Problem polega że nie wszystkie wartości dają się w ten sposób poprawnie zamienić, gdyż typ int obsługuje także wartości ujemne, w odróżnieniu od typu wskaźnikowego ( unsigned ).

W ogóle dziwię się że to się skompilowało, gdyż powinieneś dostać następujący błąd:
cpp error: cast from 'char*' to 'int' loses precision

Chyba że masz ustawiony znacznik -fpermissive.

0

@several:

char tekst[20]="Jakis tekst";
char* tekstwsk = tekst;

a czemu np.

cout << endl << endl << tekst << "..." << tekstwsk << "... " << (*tekstwsk+2) << "..." << tekstwsk[2] << "..." << &tekst << "...." <<&tekstwsk << "... " << (int*)tekstwsk;

*tekstwsk+2 nie pokazuje tego znaku, który chcę wyswietlic?

2

*tekstwsk+2 nie pokazuje tego znaku, który chcę wyswietlic?

A który znak chcesz wyświetlić? Zwróć uwagę na kolejność wykonania operatorów, prawdopodobnie chciałeś otrzymać wynik równoznaczny z takim zapisem

*(tekstwsk + 2)

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