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