• Kurs C++ - strona główna
  • Kurs C++ - kontakt z autorem
  • Kurs C++ - mapa witryny
  • Kurs C++ - prawa autorskie
  • Kurs C++ - Kanał RSS
Informatyka krok po kroku
Użytkownik niezalogowany

Witaj nieznajomy

Reklamy
Randki

Lekcja 28

Wskaźniki (typ wskaźnikowy) - część druga. Inicjalizacja, zasady, stałe wskaźniki

utworzono: 2005-04-20 zmodyfikowano: 2005-04-20 Autor: mgr inż. Marcin Nabiałek

Wprowadzenie

W tej lekcji przedstawię Ci kolejne zagadnienia związane ze wskaźnikami. Jeśli nie znasz poprzedniej lekcji, lepiej się z nią zapoznaj, bowiem przedstawione tutaj problemy i metody, będą bazowały niemal w całości na wiedzy z poprzedniej lekcji.

Inicjalizacja wskaźnika

Jak dobrze wiesz, wskaźniki nie muszą być inicjalizowane. Można dokonać zwykłego przypisania, tak jak to robiliśmy w poprzedniej lekcji i wszystko działa jak trzeba. W rzeczywistości jednak, inicjalizację wskaźników wykorzystuje się co najmniej równie często, co zwykłe ustawianie wskaźnika, o ile nie częściej.

Jeśli dobrze znasz poprzednią lekcję, powinno Ci się przypomnieć moje stwierdzenie dotyczące inicjalizacji, że najlepiej jej nie stosować na początkowym etapie nauki. Zdania oczywiście nie zmieniam, problem jednak w tym, że od inicjalizacji wskaźników, nawet na początkowym etapie ich nauki, uciec się nie da.

Czemu zatem moim zdaniem, inicjalizacja wskaźników jest taka zła? Chodzi mianowicie o jej zapis - niemal wszyscy, którzy stosują inicjalizację, mają problem ze stosowaniem tego wszystkiego, co przedstawiłem Ci w poprzedniej lekcji lub szybko zapominają wpajane im wcześniej reguły. Apeluję do Ciebie - nie zapominaj o tym wszystkim, czego nauczyłem Cię w poprzedniej lekcji, bo wskaźniki naprawdę będą Ci wielokrotnie potrzebne.

Przejdźmy jednak do sprawcy całego zamieszania, czyli inicjalizacji. Schematycznie inicjalizacja wskaźnika wygląda następująco:

typ *nazwaWskaznika = &nazwaZmiennej;

Czy widzisz już problem albo coś dziwnego w powyższym zapisie? Jeśli nie, to przyjrzyj się jeszcze raz i chwilę się zastanów.

Gdy dobrze się przyjrzysz, zauważysz, że po lewej stronie mamy jakby wyłuskanie wartości ze wskaźnika, a po prawej stronie mamy adres zmiennej, z którą wskaźnik zostaje związany. Jeśli jednak dokładnie udało Ci się przeczytać poprzednią lekcję, wiesz dobrze, że gwiazdka nie zawsze oznacza wyłuskanie - w tym przypadku oznacza ona po prostu, że tworzona zmienna jest wskaźnikiem i nie oznacza wyłuskania.

Gdzie zatem konkretnie pojawia się błąd? Otóż, początkujące osoby, stosując często bezmyślnie inicjalizację, zapominają, że wskaźniki przechowują wyłącznie adresy zmiennych, na które wskazują, a żeby wydobyć faktyczną wartość zmiennej powiązanej ze wskaźnikiem, należy skorzystać z operatora wyłuskania.

Co gorsza, jeśli takie osoby mają w programie dwie zmienne i jeden wskaźnik i w którymś miejscu programu chcą przestawić wskaźnik z jednej zmiennej na drugą, stosują błędny zapis, wzorując się na inicjalizacji:

*nazwaWskaznika = &nazwaZmiennej; // UWAGA - BLAD!!!

Musisz bowiem przyznać, że nie wiedząc, w jaki sposób dokonuje się przypisania wartości wskaźnika, a widząc inicjalizację wskaźnika, również Tobie, jako pierwsza myśl, przyszedłby do głowy taki właśnie zapis. Na szczęście większość kompilatorów ostrzeże przed takim działaniem, jednak nie wszystkie.

Nawet jeśli kompilator zgłasza błąd, osoby, które stały się ofiarami mylnego zapisu inicjalizacji, nie wiedzą o co tak naprawdę chodzi i tracą niekiedy cenny czas na szukaniu błędów. Dlaczego Ci o tym wspominam? Bo naprawdę widziałem to już wiele razy. Dlatego też pamiętaj, że inicjalizacja mimo że przydatna, w przypadku wskaźników jest zwodnicza i żeby ją stosować, naprawdę warto wcześniej dobrze wiedzieć, jak działają wskaźniki.

dodajdo

1 | 2 | 3 | 4 | 5 | 6 | > | |>

Użytkowanie Serwisu oznacza zgodę na wykorzystywanie plików cookie. Szczegółowe informacje