WSKAŹNIKI INDEX

Programowanie w C++

Wskaźniki w argumentach funkcji


Jedną z domen zastosowania wskaźników jest możliwość użycia ich w argumentach funkcji. Pamiętamy, że domyślnie argumenty przesyłane są do funkcji przez wartość (za wyjątkiem tablic). Jeśli wysyłamy do funkcji jako argument "zwykłą" zmienną, to funkcja nie operuje na oryginale, lecz tworzy sobie do pracy kopię tej zmiennej. Popatrzmy na krótki programik wskfun.cpp.

Deklarujemy w nim dwie przeładowane funkcje o nazwie f. Obie nie zwracają żadnego rezultatu (są typu void). Jedna z nich pobiera argument typu int, a druga wskaźnik do obiektu typu int. W funkcji main definiujemy sobie zmienną lokalną x i inicjalizujemy ją na liczbę 5. Następnie dwa razy wywołujemy funkcję f oraz wyświetlamy zawartość zmiennej lokalnej x.

Za pierwszym razem wysyłamy do funkcji argument x w "tradycyjny" sposób tzn. przez wartość. Uruchamiana jest zatem funkcja o prototypie:

    void f(int arg);
W jej definicji widzimy tylko jedną linijkę podwajającą wartość zmiennej lokalnej arg. Jednak zmienna x w main nie zostaje zmieniona (wiemy to dzięki instrukcji cout). Dlaczego? Użyliśmy tutaj mechanizmu przesyłania przez wartość. Zmienna x została skopiowana i omawiana funkcja korzysta właśnie z tej kopii utworzonej na stosie. Funkcja modyfikuje kopię, a nie oryginał z funkcji main. Kończy działanie nie zwracając rezultatu, zatem wszystkie śmieci ze stosu zostają uprzątnięte i nasza zmodyfikowana kopia przestaje istnieć.

W drugim przypadku wysyłamy do funkcji f adres zmiennej x, bowiem przed nazwą zmiennej jest operator jednoargumentowy & (operator pobrania adresu, ampersand). Uruchamia się zatem funkcja zadeklarowana jako:

    void f(int *wsk);
Widzimy (znów dzięki cout), że ona potrafiła zmodyfikować obiekt x, mimo że również nie zwróciła rezultatu. Dzieje się to dlatego, że funkcja operuje na adresie zmiennej x, na który pokazuje w jej wnętrzu wskaźnik wsk. Poprzez ten wskaźnik modyfikowana jest zawartość komórek pamięci zarezerwowanych przez zmienną x jeszcze w funkcji main.

Pięknie, ale po co od razu używać wskaźników. Możemy przecież zadeklarować pierwszą funkcję f tak, aby zwracała rezultat typu całkowitego, a pod koniec definicji funkcji dopisać instrukcję:

    return (arg);
Teraz można w funkcji main dokonać przypisania postaci:
    x = f(x);
które spowoduje podwojenie wartości tej zmiennej. W tym przypadku jest to dobre rozwiązanie, ale co zrobić, kiedy chcemy zmodyfikować wewnątrz funkcji więcej przesłanych do niej argumentów. Przecież funkcja może zwracać tylko jedną wartość. Wtedy bardzo pomocne mogą okazać się wskaźniki. W pliku heron.cpp znajduje się przykład programu wykorzystującego tę technikę.

WSKAŹNIKI INDEX