Portal internetowy i Darmowy Kurs Programowania C++
  Forum C++
 
=> Nie jesteś jeszcze zarejestrowany?

Rzeczy związane z C# Dobrze zaczac od drugiej strony

Forum C - Wskazniki

Znajdujesz się tutaj:
Forum C => Kursy => Wskazniki

<-Powrót

 1 

Dalej->


admin
(18 postów dotychczas)
13.02.2008 22:49 (UTC)[zacytuj]
Wskazniki
To jest rozdział, którego najbardziej się obawiałem :-/ Wskaźniki są bardzo przydatne i mogą znacznie ułatwić Ci życie pod warunkiem, że się je rozumie No właśnie.. Tutaj pojawia się problem. Zagadnienie wskaźników jak kilka innych aspektów C++ może skutecznie odstraszyć od programowania. Wielu ludzi uważa je za zbędne. Jeśli czegoś nie rozumiemy, to uważamy to za głupie, nielogiczne i zbędne Prawdopodobnie na początku odniesiesz podobne wrażenie i będziesz się trochę gubił. Nie przejmuj się. Ja również miałem drobne problemy ze zrozumieniem wskaźników. Na moje szczęście z natury jestem bardzo uparty i nie dałem za wygraną. Tobie też tak radzę. Zobaczysz, że trud włożony w opanowanie wskaźników szybko się opłaci. A jak już poznasz je dobrze, to będziesz się śmiał, że to przecież jest prościutkie Bez zbędnych komentarzy zacznijmy od.. przykładziku.
Jest lekcja Historii [jakże ja nie cierpię tego przedmiotu ] Belfer nawija smutnym monologiem, a od czasu do czasu popiera swe wydory mapką wiszącą na ścianie. Wskazuje ręką pewne istotne miejsca na mapie. Niestety gośc ma pecha, gdyż mapka wisi dość wysoko, a on jest zbyt niski i nie może dosięgnąć Bierze więc drewniany patyk i z pełnym entuzjazmem wskazuje wcześniej nie osiągalne miejsce na mapie.
W naszym przykładzie owy patyczek to właśnie wskaźnik. Widzisz, jak pomógł w rozwiązaniu problemu? Oczywiście drewniany wskaźnik nie był niezbędny, gdyż możnabyło.. obniżyć mapkę, podstawić stołek etc. Jednak drewienko okazało się najrozsądniejszym i najszybszym rozwiązaniem.
Tak właśnie jest w programowaniu. Można w ogóle nie używać wskaźników i radzić sobie. Pytnie tylko, co na tym zyskamy? Lub bardziej trafnie: Czy w ogóle coś na tym zyskamy? Odpowiem prosto: Zyskać, nie zyskamy nic! Wręcz przeciwnie - stracimy i to bardzo dużo! To właśnie za sprawą wskaźników C++ jest tak uniwersalny i elastyczny na późniejsze modyfikacje kodu. Uwierz mi umiejętne korzystanie ze wskaźników jest na prawdę pomocne, a w niektórych przypadkach po prostu nie da się osiągnąć pewnych zamierzeń bez użycia wskaźników!
Dobra, jeśli tutaj dotarłeś to zapewne wziąłeś sobie głęboko do serducha moje słowa i chcesz zrozumieć istotę wskaźników. Bardzo dobrze, wyjaśnijmy sobie czym właściwie wskaźnik jest? Już sama nazwa stanowi pewną informację. Wskaźnik służy do.. wskazywania. Oczywiście od razu nasuwa się pytanie: na co wskaźnik pokazuje? To już nasza sprawa. Wskaźnik można ustawić na dowolny obszar w pamięci Pamiętasz jeszcze, czym są zmienne? Sądzę, że tak. Jednak dla formalności przypomnę. Zmienna to wydzielony obszar pamięci posiadający własną nazwę oraz określoną wartość. Ze wskaźnikiem jest ciut inaczej. To ustrojstwo podobnie jak zmienna także znajduje się w pamięci. Posiada też swoją nazwę. Teraz pojawia się nowość. Zmienne poznane do tej pory zawierały dowolną wartość liczbową. Wskaźnik nie posiada wartości liczbowej, lecz.. Teraz uważaj - adres komórki pamięci :-/ [wprawdzie adres jest określany liczbowo, ale nie chciałem zaciemniać] Rozumiesz co to oznacza? Wskaźnik zawiera jedynie informację o lokalizacji konkretnego obiektu. Pora na przykład definicji:

int *wskaznik;
Praktycznie wszystko byłoby jasne, gdyby nie gwiazdka. Jest to operator odniesienia się do obiektu. Czasem nazywa się go operatorem wyłuskania. W przykładzie zdefiniowaliśmy sobie wskaźnik mogący pokazywać na obiekty typu int. Zauważ podobieństwo do definicji zwykłej zmiennej. Jeżeli wyrzucilibyśmy gwiazdkę mielibyśmy zwykłą definicję zmiennej typu int o nazwie wskaznik. Składnia jest bardzo zbliżona, dzięki czemu nie trzeba się dużo uczyć Mając taki wskaźnik możemy go ustawić na dowolnym obiekcie typu int. Teraz popatrz jak się to robi.

int zmienna;
int *wskaznik;
wskaznik = &zmienna;
Najpierw zdefiniowaliśmy sobie zmienną typu int, później wskaznik również typu int. To jest już znane. W trzeciej linijce jest ustawienie wskaźnika na zmienną. Zwróć uwagę, że teraz nie ma żadnej gwiazdki. Pojawia się natomiast ampersand [&]. Jest to kolejny operator. Służy do pobrania adresu obiektu. Spójrz raz jeszcze na przykład. Ustawienie jest zbliżone do podstawienia wartości do zmiennej. Różnicą jest znaczek &. Zapamiętaj to sobie tak. Wskaźnik zawsze zawiera adres. Zmienna posiada określoną wartość. Jeżeli nie podałbyś znaczka & oznaczałoby to, że chcesz podstawić wartość zmiennej do wskaźnika. Wskaźnik przechowuje adres, a nie wartość. Zatem byłby to błąd. Pamiętaj o tym! Mając już ustawiony wskaźnik na zmienną możemy się do niej odwołać dwojako. Pierwszy sposób już znasz od dawna. Zwykła operacja na zmiennej. Teraz zobacz, jak można się odnieść do zmiennej za pomocą wskaźnika.

zmienna = 22;
*wskaznik = 22;
Najpierw jest podstawienie wartości 22 do zmiennej. To znamy. Teraz wykonujemy tą samą operację, ale z użyciem wskaźnika. Jak widzisz jest to trochę zagmatwane. Znów pojawia się gwiazdka. Jeżeli nie podałbyś gwiazdki kompilator uznałby, że chcesz ustawić wskaźnik na 22 komórkę pamięci. Nam jednak chodzi o podstawienie wartośći 22 do zmiennej pokazywanej przez wskaźnik. Zatem zupełnie coś innego. Gwiazdka informuje kompilator, że chodzi o obiekt, na który pokazuje wskaźnik. Wiem, że to trochę zawiłe. Najlepszym sposobem na opanowanie wskaźników jest po prostu.. trening. Poćwicz trochę definicje wskaźników oraz odnoszenie się do obiektów za pomocą wskaźników. Zobaczysz, że po pewnym czasie powyższe operacje okażą się bardzo proste. Wskaźniki mają jeszcze jedna przydatną cechę. W dowolnym momencie można zmienić typ wskaźnika. Robi się to za pomocą operatora rzutowania. Zerknij sobie:

long *wsk_uniwersalny;
long zmienna_long;
int zmienna_int;
double zmienna_double;

wsk_uniwersalny = &zmienna_long;
wsk_uniwersalny = (long *)&zmienna_int;
wsk_uniwersalny = (long *)&zmienna_double;
Wpierw zdefiniowaliśmy sobie wsk_uniwersalny mogący pokazywać na liczby long. Następnie definiujemy sobie trzy zmienne różnych typów. Teraz ustawiamy nasz wskaźnik na zmienną typu long. Wszystko jest w porządku. Zarówno zmienna, jak i wskaźnik są tego samego typu. Jak myślisz, co się stanie, gdy podstawimy do wskaźnika zmienną innego typu? Nie trudno się domyślić, że kompilator wywali błąd. Jednakże są sytuacje kiedy podstawienie pod wskaźnik zmiennej innego typu jest przydatne. Zmiana, czyli konwersja zachodzi za sprawą operatora rzutowania. Taki operator, to nic innego, jak zwykły nawias stawiany przed konwertowanym typem, a zawierający określenie nowego typu. Zatem linijka:

wsk_uniwersalny = (long *)&zmienna_int;
spowoduje, że zmienna_int, będąca typu int, zostanie potraktowana, jak zmienna typu long. Dzięki temu możliwe będzie przypisanie jej adresu do uniwersalnego_wskaźnika, który jest wskaźnikiem pokazującym na liczby long. W następnej linijce jest ta sama sytuacja. Tym razem zachodzi konwersja z typu double na typ long. Pamiętaj tylko, że w nawiasie należy jeszcze podać gwiazdkę. Informuje ona kompilator, że chodzi o wskaźnik, a nie o zmienną.

wskaźniki stałe vs. wskaźniki do stałych
Pamiętasz jeszcze, jedną z początkowych lekcji, w której mówiiśmy o zmiennych? Tam też dowiedziałeś się, że czasem zachodzi potrzeba [lub ktoś ma taki kaprys ] aby pewne zmienne nie zmieniały swych wartości, czyli były.. stałe. Stałe definiowaliśmy poprzedzając je słówkiem const. Stałe możnabyło inicjalizować tylko podczas ich definicji. Wartość raz nadana nie mogła ulec zmianie. Jak już pewnie się domyślasz, wskaźnikami również można tak manipulować. Tradycyjnie przykładzik:

float x, y;
float * const wsk = &x; //zainicjalizować można tylko tutaj!
//wsk = &y;

Odpowiedz:

Twój nick:

 Kolor tekstu:

 Wielkość tekstu:
Zamknij tagi



Tematy łącznie: 19
Posty łącznie: 56
Użytkownicy łącznie: 48
Obecnie online jest (zarejestrowanych użytkowników): Nikt crying smiley
 
 
   
 
Ta strona internetowa została utworzona bezpłatnie pod adresem Stronygratis.pl. Czy chcesz też mieć własną stronę internetową?
Darmowa rejestracja