Wskaźniki
Wskaźniki bez wątpienia są niezwykle ważnym elementem C++. Umożliwiają wykonywanie operacji bezpośrednio na wybranych obiektach w pamięci komputera np. na innych zmiennych, lub funkcjach. Tak więc, wskaźnikiem możemy nazwać zmienną która wskazuje na konkretny adres innego obiektu w pamięci. Najprostsza deklaracja wskaźnika wygląda następująco :
W ten sposób za pomocą tak zwanego operatora wyłuskiwania ‘*’ tworzymy zmienną wskaźnikową, której następnie używając operatora ‘&’ przypisujemy adres zmiennej x.
Aby zrozumieć powyższą definicje porównajmy dwie grupy instrukcji:
oraz
W pierwszym bloku dokonujemy prostego przypisania zmiennej y wartości zmiennej x. Natomiast w drugim deklarujemy dodatkowo zmienną wskaźnikową xptr, której przypisujemy adres zmiennej x. Następnie zmiennej y przypisujemy wartość, na którą wskazuje wskaźnik xptr. Po wykonaniu dwóch powyższych grup instrukcji, zmienna y będzie posiadała taką samą wartość. W związku z tym ktoś mógłby zapytać, w jakim celu powinniśmy stosować wskaźniki? W tym wypadku faktycznie nie miałoby to sensu. Jednak wskaźniki posiadają jeszcze jedną ważną cechę. Ponieważ odwołują się do konkretnego obiektu w pamięci jego każda modyfikacja wpływa na wartość wskaźnika. Wykonajmy np. następujący kod:
Po dołączeniu potrzebnych bibliotek i zadeklarowaniu zmiennych, z których będziemy korzystać, zmiennej x przypisujemy wartość 40. Następnie zmiennej wskaźnikowej przypisujemy adres zmiennej x. Teraz jednak przed przypisaniem zmiennej y wartości na którą wskazuje zmienna wskaźnikowa zmieniamy wartość zmiennej x na 50. Gdy uruchomimy program zostanie wypisana wartość 50, a nie 40. Powyższy przykład ilustruje dobrze fakt, iż wskaźnik odnosi się do konkretnego obszaru pamięci i każda jego modyfikacja wpływa na wartość wskaźnika.
Wskaźniki działają również w odwrotną stronę, każda modyfikacja wskaźnika wpływa na wartość zmiennej na którą wskazuje. Aby to zobrazować wykonajmy następujący program:
Podczas działania programu zmiennej wskaźnikowej przypisujemy wartość 50. Ponieważ wskaźnik odwołuje się do obszaru pamięci zmiennej x, zmienna ta przybiera również wartość 50, o czym można się przekonać uruchamiając program.
Jeżeli mimo zrozumienia działania wskaźników wciąż nie wiesz, do czego mogą się one przydać, nie powinieneś się przejmować, w pewnym momencie odczujesz potrzebę skorzystania z ich zalet. Wskaźniki bardzo często wykorzystuje się do przekazywania obiektów jako parametry funkcji, aby były one widoczne w jej wnętrzu.
int *xptr = &x;
W ten sposób za pomocą tak zwanego operatora wyłuskiwania ‘*’ tworzymy zmienną wskaźnikową, której następnie używając operatora ‘&’ przypisujemy adres zmiennej x.
Aby zrozumieć powyższą definicje porównajmy dwie grupy instrukcji:
int x=40, y;
y = x;
y = x;
oraz
int x= 40, y, *xptr;
xptr = &x;
y = *xptr;
xptr = &x;
y = *xptr;
W pierwszym bloku dokonujemy prostego przypisania zmiennej y wartości zmiennej x. Natomiast w drugim deklarujemy dodatkowo zmienną wskaźnikową xptr, której przypisujemy adres zmiennej x. Następnie zmiennej y przypisujemy wartość, na którą wskazuje wskaźnik xptr. Po wykonaniu dwóch powyższych grup instrukcji, zmienna y będzie posiadała taką samą wartość. W związku z tym ktoś mógłby zapytać, w jakim celu powinniśmy stosować wskaźniki? W tym wypadku faktycznie nie miałoby to sensu. Jednak wskaźniki posiadają jeszcze jedną ważną cechę. Ponieważ odwołują się do konkretnego obiektu w pamięci jego każda modyfikacja wpływa na wartość wskaźnika. Wykonajmy np. następujący kod:
#include <iostream.h>
#include <conio.h>
int main()
{
int x, y, *xptr;
x = 40;
xptr = &x;
x = 50;
y = *xptr;
cout << y;
system("pause>null");
return 0;
}
#include <conio.h>
int main()
{
int x, y, *xptr;
x = 40;
xptr = &x;
x = 50;
y = *xptr;
cout << y;
system("pause>null");
return 0;
}
Po dołączeniu potrzebnych bibliotek i zadeklarowaniu zmiennych, z których będziemy korzystać, zmiennej x przypisujemy wartość 40. Następnie zmiennej wskaźnikowej przypisujemy adres zmiennej x. Teraz jednak przed przypisaniem zmiennej y wartości na którą wskazuje zmienna wskaźnikowa zmieniamy wartość zmiennej x na 50. Gdy uruchomimy program zostanie wypisana wartość 50, a nie 40. Powyższy przykład ilustruje dobrze fakt, iż wskaźnik odnosi się do konkretnego obszaru pamięci i każda jego modyfikacja wpływa na wartość wskaźnika.
Wskaźniki działają również w odwrotną stronę, każda modyfikacja wskaźnika wpływa na wartość zmiennej na którą wskazuje. Aby to zobrazować wykonajmy następujący program:
#include <iostream.h>
#include <conio.h>
int main()
{
int x, y, *xptr;
x = 40;
xptr = &x;
*xptr = 50;
cout << x;
system("pause>null");
return 0;
}
#include <conio.h>
int main()
{
int x, y, *xptr;
x = 40;
xptr = &x;
*xptr = 50;
cout << x;
system("pause>null");
return 0;
}
Podczas działania programu zmiennej wskaźnikowej przypisujemy wartość 50. Ponieważ wskaźnik odwołuje się do obszaru pamięci zmiennej x, zmienna ta przybiera również wartość 50, o czym można się przekonać uruchamiając program.
Jeżeli mimo zrozumienia działania wskaźników wciąż nie wiesz, do czego mogą się one przydać, nie powinieneś się przejmować, w pewnym momencie odczujesz potrzebę skorzystania z ich zalet. Wskaźniki bardzo często wykorzystuje się do przekazywania obiektów jako parametry funkcji, aby były one widoczne w jej wnętrzu.
Materiał dodany przez użytkownika: alphan
