Wykład 10 - Wydział Matematyki i Informatyki UŁ
Transkrypt
Wykład 10 - Wydział Matematyki i Informatyki UŁ
Wstęp do programowania wykład 10 Piotr Cybula Wydział Matematyki i Informatyki UŁ 2012/2013 http://www.math.uni.lodz.pl/~cybula Przesyłanie argumentów do funkcji W języku C argumenty przesyłane do funkcji są tylko kopiami – działanie na nich nie dotyczy oryginału (przesyłanie przez wartość) tak było we wszystkich dotychczasowych przykładach kolejny przykład – zamiana1.c Do funkcji przesyłana jest tylko wartość liczbowa parametru aktualnego, która służy do inicjalizacji parametru formalnego (zmiennej lokalnej tworzonej przez funkcję na stosie). Funkcja operuje na kopii „właściwej” zmiennej. Po opuszczeniu funkcji ten fragment stosu jest niszczony, więc zmienna „właściwa” zostaje bez zmiany. Przesyłanie argumentów do funkcji Aby funkcja modyfikowała wartości zmiennych, a nie operowała na ich kopiach, musimy przesłać argumenty do funkcji przez adres (w C++ można też przez referencję) przykład – zamiana2.c Przy przesyłaniu argumentów przez adres do funkcji wysyłana jest kopia adresu danej zmiennej w pamięci komputera. Funkcja zapamiętuje na stosie adres obiektu – ale w tym przypadku korzystanie z kopii adresu i tak powoduje działanie na tej samej komórce, zatem wartość żądanej zmiennej jest modyfikowana. Zmienne adresowe (wskaźniki) Do tej pory posługiwaliśmy się zmiennymi i stałymi Nazwa zmiennej odwoływała się do obszaru pamięci o określonym (niezmiennym) adresie adres pamięci pod którym znajduje się zmienna można było uzyskać za pomocą operatora & (przez &zmienna) przykład: adres.c Wskaźnik może odwoływać się do różnych miejsc w pamięci (niekoniecznie zawsze do jednego) ... przy czym zazwyczaj jest zdefiniowany tak, że pokazuje na obiekty jednego określonego typu: int *w; definicja wskaźnika mogącego pokazywać na obiekty typu int wskaźnik służący do pokazywania na obiekty jednego typu nie może (zazwyczaj) pokazywać na obiekty innego typu Referencja i dereferencja int *w; // definicja wskaźnika (o nazwie w) int z = 3; //definicja zmiennej w = &z; //ustawienie wskaźnika (referencja) wskaźnik w pokazuje na miejsce pamięci w którym jest zmienna z *w = 100; // w miejsce pokazywane przez // wskaźnik w (dereferencja) // wstawiamy konkretną wartość przykład: wskazniki.c Przestawianie wskaźników Jeśli mamy zmienną int z; i wskaźnik int *w1; to zapis w1 = &z; powoduje, że wskaźnik w1 pokazuje na miejsce w którym jest zmienna z Jeśli mamy drugi wskaźnik int *w2; to zapis w2 = w1; powoduje że wskaźniki w1 i w2 pokazują na to samo miejsce w pamięci powyższe przypisanie jest możliwe gdy wskaźniki są zgodnych typów Przesyłanie argumentów do funkcji - tablice Nazwa tablicy jest równocześnie adresem jej zerowego elementu Wywołując funkcję dla danej tablicy podajemy jej nazwę przykład: zamiana_tab.c może być tak, że wewnątrz funkcji znany jest tylko adres początku tablicy i typ jej elementów (ale długość już nie) przykład: tablice_fun.c Tablicy nie da się przesłać do funkcji przez wartość, można w ten sposób przesłać co najwyżej jej poszczególne elementy Funkcje rekurencyjne Funkcja może wywoływać samą siebie. Jest to tzw. rekurencja (rekursja). Może to robić każda funkcja, tyle że jeśli nie ma w niej warunku zatrzymującego rekurencję, to funkcja będzie się wywoływała się w nieskończoność, tzn. aż do wyczerpania pamięci Przykłady: silnia_rek.c, hanoi.c