funkcje - przekazywanie parametrów
Transkrypt
funkcje - przekazywanie parametrów
Przekazywanie parametrów do funkcji Wiemy ju , e do napisanych przez nas funkcji (do systemowych zreszt tak e) mo na przekazywa parametry. W tym odcinku opowiem o sposobach przekazywania parametrów i o mo liwociach, jakie si z tym wi . a) przekazywanie przez warto: Sposób ten był prezentowany w poprzednim odcinku, chocia nie został nazwany „po imieniu”. Definicja funkcji: int sumuj(int a, int b) { int c = a+b; return c; } i jej wywołanie: wynik=sumuj(x1,x2); Przekazuj c parametr przez warto nie mamy wpływu na to, co si z nim dzieje wewntrz funkcji. A raczej to, co si z nim dzieje wewntrz funkcji nie ma adnego znaczenia dla wartoci tego parametru na zewntrz. Krótko mówi c: cho bymy próbowali zmieni w funkcji jego warto , to o ile nie zwracamy tego parametru jako wynik (za pomoc return), na zewntrz funkcji ta zmiana nie bdzie widoczna. Sprawd my to nastpuj co: void podwoj_parametr(int a) { a=a*2; return; } Po wywołaniu: int liczba=10; podwoj_parametr(liczba); printf(„Liczba po podwojeniu = %d”,liczba); Podstawy Informatyki rok akad. 2003/2004 mgr in . Paweł Myszkowski nie zauwaymy adnej zmiany w wartoci parametru liczba. Intuicyjnie spodziewamy si , e warto zmiennej liczba wyniesie 20. Na ekranie ukae si napis: Liczba po podwojeniu = 10. Dlaczego tak si dzieje ? Otó jeli przekazujemy parametr przez warto , to wszelkie operacje wewntrz funkcji nie odbywaj si na tym parametrze, ale na jego kopii stworzonej lokalnie na starcie funkcji. Ta kopia jest z kolei usuwana przy wyj ciu z funkcji, a co za tym idzie – nie jest widoczna na zewntrz. Inaczej mówi c po przekazaniu sterowania do funkcji tworzone s kopie zmiennych przekazywanych do funkcji i wszystkie działania w funkcji wykonywane s na kopiach. Ten proces jest niewidoczny dla uytkownika, ale widoczne s efekty jego działania. Musimy wi c zdawa sobie z tego spraw. Czsto chcemy, aby w funkcji wartoci kilku zmiennych ulegały zmianie. Przypomn, e stosuj c nabyte dotychczas wiadomoci moemy „wyprowadzi ” z funkcji tylko jedn warto – t, któr funkcja zwraca (za pomoc return). Jak zmieni w funkcji wartoci kilku zmiennych ? Mamy dwie moliwoci. b) przekazywanie parametrów przez wska nik Tym razem do funkcji nie trafia zmienna, tylko wska nik na ni . W zwi zku z tym operacje wykonywane s na obszarze pami ci zawierajcym warto zmiennej. Krótko mówi c – na konkretnej wartoci. Tu nie s tworzone lokalne kopie przekazywanych parametrów. Przekazywana jest co prawda nadal warto, ale t wartoci jest wska nik do zmiennej. Oczywi cie inaczej wygl da zarówno definicja funkcji, jak i jej wywołanie. Definicja funkcji: void zamien(int* a, int* b) { int pom = *a; *a = *b; *b = pom; return; } i jej wywołanie: int a,b; a = 10; b = 20; zamien(&a,&b); //przekazujemy adres zmiennej – tak jak w funkcji scanf Jak łatwo sprawdzi , tym razem udało si nam zmieni warto dwóch zmiennych. Podstawy Informatyki rok akad. 2003/2004 mgr in . Paweł Myszkowski c) przekazywanie parametrów przez referencj W tym przypadku do funkcji trafia referencja (odwołanie) na adres zmiennej. U ywamy do tego operatora &, słu acego do pobrania adresu. Podobnie jak w poprzednim przypadku operacje wykonywane s na obszarze pami ci zawierajcym warto zmiennej. Jednak ten sposób przekazania jest bardziej przejrzysty. Definicja funkcji: void zamien(int &a, int &b) { int pom = a; a = b; b = pom; return; } i jej wywołanie: int a,b; a = 10; b = 20; zamien(a,b); //wywołanie nie róni si od przekazywania przez warto Podobnie jak w poprzednim przypadku, zmiana obu parametrów bdzie widoczna poza funkcj . Na koniec jeszcze kilka słów o przekazywaniu tablic jako parametrów do funkcji. Typ tablicowy jest o tyle specyficzny, e nazwa tablicy jest jednoczenie adresem jej pierwszego elementu. Wi c cho wywołanie wygl da na przekazanie przez warto , w rzeczywistoci jest to przekazanie przez referencj . W zwi zku z tym funkcja operuje bezporednio na wartociach przekazywanej zmiennej i moe te wartoci modyfikowa . Definicja funkcji: void zeruj(int tablica[10]) { for (int i=0;i<10;i++) tablica[i]=0; } i jej wywołanie: int a[10]; ... zeruj(a); //w wywołaniu nie podajemy rozmiaru, a jedynie sam nazw Podstawy Informatyki rok akad. 2003/2004 mgr in . Paweł Myszkowski