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

Podobne dokumenty