admin
|
|
« : Styczeń 02, 2013, 12:10:12 » |
|
Wskaźniki * Dotychczas, we wszystkich funkcjach które przedstawiałem, argumenty były przekazywanych do funkcji przez wartość. Oznacza to, że wywołanie funkcji z parametrami, powodowało,że do funkcji przekazywane były były kopie wartości zmiennych ale nie oryginały. Oznacza to, że wartość początkowa zmiennej przekazanej do funkcji nie była modyfikowana przez ta funkcję.
Wskaźniki są odpowiednikiem adresu pamięci w której umieszczono wartość zmiennej. Stanowią uzupełnienie klasycznych zmiennych. Wskaźniki deklarowane są podobnie jak inne zmienne, przed jej użyciem. Jedyną różnicą jest wpisanie gwiazdki przed nazwą zmiennej wskaźnikowej. Istotną różnica w porównaniu do deklaracji zmiennych jest to,że odwołanie następuje do wskazania adresu (wskazania!!!!).
Przykład 1 -deklaracja zmiennej wskaźnikowej
using namespace std; main() {int *i, *a,b; char *ab_adr; system("pause");}
W programie zadeklarowano zmienne wskaźnikowe: i, a, ab_adr. Bardzo ważnym jest umiejętność stwierdzenia jaka wartość znajduje pod zmienną wskaźnikową (adresem wskazywanym przez wskaźnik). Należy pamiętać,że zmienna *a przedstawia wartość która znajduje się pod adresem a (a- to inna nazwa adresu).
Przykład 2 - odczytywanie wartości ukrytej pod adresem przekazywanym przez wskaźnik.
#include <cstdlib> #include <iostream>
using namespace std;
int main(int argc, char *argv[]) { int *i,*a,b; *i=1000; cout<<" w pamięci komputera pod adresem: "<<i<<endl; cout<<"znajduje się wartość: "<<*i<<endl; system("PAUSE"); return EXIT_SUCCESS; }
Program kompiluje poprawnie jednak jego wywołanie powoduje błąd (WIN Vista). Dlaczego? Program napisany powyżej zapisuje w pamięci pod przypadkowym adresem wartość 1000. Problem polega na braku ustalonego miejsca w pamięci w którym ma być zapisana liczba 1000. Miejsce to jest przypadkowe, jeżeli trafi na komórkę w którym jest umieszczona np. wartość opisująca rozdzielczość ekranu to zostanie ona zmieniona na inną, co spowoduje zakłócenia w pracy komputera. Na szczęście systemy operacyjne chronią istotne obszary pamięci operacyjnej.
|