Lekcja 29
Wskaźniki (typ wskaźnikowy) - część trzecia. Operacje na kilku wskaźnikach
Wprowadzenie
Mimo że przedstawiłem Ci już trochę informacji o wskaźnikach, to nadal tak naprawdę nie wiesz o nich zbyt wiele. W tej lekcji postaram Ci się zademonstrować kilka użytecznych zastosowań wskaźników i pokazać, w jaki sposób nie popełniać błędów, które nas mogą drogo kosztować.
Kilka wskaźników - przykład 1
We wszystkich do tej pory przykładach mieliśmy do czynienia tylko z jednym wskaźnikiem. Nawet jeśli w programie pojawiały się dwa wskaźniki, to były one od siebie zupełnie niezależne i tak naprawdę nie miały na siebie żadnego wpływu.
Jako jednak, że wskaźniki dają bardzo duże możliwości, często stosuje się ich co najmniej kilka w jednym programie i dokonuje wielu operacji na kilku wskaźnikach, modyfikując wartości wskaźników lub wartości zmiennych przez wskaźniki pokazywanych.
Przejdźmy od razu do jakiegoś przykładowego programu, a dopiero później zastanowimy się, co się w programie dzieje. Oto program:
#include <iostream>
using namespace std;
int main()
{
double liczba=95.21; // zmienna typu double
double *wskaznik1, *wskaznik2; //wskazniki do typu double
wskaznik1 = &liczba; // ustawiamy wskaznik na zmienna typu double
cout <<"Wartosc zmiennej liczba wynosi: "<<liczba<<endl;
cout <<"Wyluskana wartosc ze wskaznika1 wynosi: "<< *wskaznik1 <<endl;
// wskaznik2 = *wskaznik1; //BLAD!!! (1)
// *wskaznik2 = wskaznik1; // BLAD!!! (2)
wskaznik2 = wskaznik1;
cout <<endl<<"Wartosc zmiennej liczba wynosi: "<<liczba<<endl;
cout <<"Wyluskana wartosc ze wskaznika1 wynosi: "<< *wskaznik1 <<endl;
cout <<"Wyluskana wartosc ze wskaznika2 wynosi: "<< *wskaznik2 <<endl;
*wskaznik2 = 5.789;
cout <<endl<<"Wartosc zmiennej liczba wynosi: "<<liczba<<endl;
cout <<"Wyluskana wartosc ze wskaznika1 wynosi: "<< *wskaznik1 <<endl;
cout <<"Wyluskana wartosc ze wskaznika2 wynosi: "<< *wskaznik2 <<endl;
*wskaznik1 = 2.23;
cout <<endl<<"Wartosc zmiennej liczba wynosi: "<<liczba<<endl;
cout <<"Wyluskana wartosc ze wskaznika1 wynosi: "<< *wskaznik1 <<endl;
cout <<"Wyluskana wartosc ze wskaznika2 wynosi: "<< *wskaznik2 <<endl;
liczba=-15.88;
cout <<endl<<"Wartosc zmiennej liczba wynosi: "<<liczba<<endl;
cout <<"Wyluskana wartosc ze wskaznika1 wynosi: "<< *wskaznik1 <<endl;
cout <<"Wyluskana wartosc ze wskaznika2 wynosi: "<< *wskaznik2 <<endl;
cout <<endl<<"Nacisnij ENTER aby zakonczyc..."<<endl;
getchar();
return 0;
}
program nr 29.1
W programie mamy do czynienia z jedną zmienną i dwoma wskaźnikami. Najpierw ustawiamy jeden ze wskaźników na zmienną, a potem usiłujemy ustawić drugi wskaźnik na pierwszy wskaźnik. Tu pojawiają się pierwsze problemy, jak coś takiego zrobić.
W linijce opatrzonej komentarzem (1), próbujemy do wartości wskaźnika, czyli adresu (wiesz już przecież, że wskaźniki przechowują adresy), przypisać wartość wyłuskaną z drugiego wskaźnika, czyli zwykłą liczbę, w tym przypadku typu double (nie jest to adres). Oczywiście jest to nieprawidłowe, a już na pewno nie o to nam chodziło. Nie powinniśmy do adresu przypisywać zwykłej wartości liczbowej.
Z kolei w linijce opatrzonej komentarzem (2) próbujemy zrobić coś innego - do wartości wyłuskanej ze wskaźnika (czyli wartości liczbowej), próbujemy przypisać adres drugiego wskaźnika. O to na pewno też nam nie chodziło.