Wskaźniki- skoro są tylko adresami to czemu mają "typy"?

0

Cześć. Ostatnio miałem trochę czasu więc wróciłem do c++. Zatrzymałem się na wskaźnikach, bo znalazłem tam coś dziwnego.
Wskaźnik to po prostu adres pamięci. Wątpię żeby adres miał zmieniał mógł zajmować różne ilości miejsca i tu moje pytanie:
Spójrzcie na ten kod:

 
char ch = '5';
double pi = 3.14;
 
char* p = &ch;
double* pp = π

Jeśli się zastanowić to p i pp przechowują adres zmiennych ch i pi. Ale skoro każdy adres zajmuje tyle samo miejsca to po co mu typ, np. char* czy double*?

1

Po to, żeby wiadomo było jak zinterpretować to na co wskazuje.

Niech zgadnę - pewnie pisujesz głównie w jakimś języku dynamicznie typowanym, a więc takim, który przy każdym obiekcie trzyma jego typ. Odzwyczaj się od tego - w C/ C++ z reguły takich informacji nie ma.

1

Po to, żeby wiedział na co wskazuje, i żeby wiedział o ile zwiększyć swoją wartość podczas przesuwania. Przecież p++ i pp++ muszą się przesunąć o inną wartość, żeby wskazać następną komórkę tablicy.

1

typ zmiennej to nie tylko rozmiar. Jeżeli pod adresem X jest jakąś zmienna i chciałbym ją np. zwiększyć o 1, to jakbyś to zrobił? Uznałbyś, że jest tam liczba całkowita czy zmiennoprzecinkowa? A może w ogóle coś innego..

2

Ale skoro każdy adres zajmuje tyle samo miejsca to po co mu typ

Żeby zmniejszyć ryzyko popełnienia błędu, zwłaszcza przypadkowego podania wskaźnika złego typu jako argumentu funkcji.
Jeśli wiesz co robisz, i chcesz użyć "złego" typu wskaźnika, zawsze możesz użyć rzutowania.

1

A skąd biedny kompilator ma potem wiedzieć na jaki typ wskazujesz? To ma przecież znaczenie - trzeba wiedzieć jak się zachować z tym typem kiedy wyłuskujesz wskaźnik, jak poruszać się po tablicy, czy uwzględnić polimorfizm. Poza tym nie wszystkie wskaźniki mają taki sam rozmiar - wskaźniki do funkcji mogą mieć inny np.

0

Wow 5 odpowiedzi w ciągu 2 minut :O Dzięki!

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