14 5




motzel.online












    



 


    


Strona domowaBogdana Modzelewskiego


Nowości
Kurs języka C
Pliki
Linki
e-mail




wizyt od 99.09.01



Najlepiej przeglądać   w rozdzielczości 1024x768







14.5. Tablice jako parametr funkcji



Długo się zastanawiałem, czy napisać o tym już teraz, w tym punkcie, czy też dopiero w następnym - już po wyjaśnieniu istoty wskaźników.
Jednak zdecydowałem się umieścić to tutaj, gdyż mimo wszystko informacje te dotyczą głównie tablic. Jednak jeśli będziesz miał problemy ze
zrozumieniem tego podpunktu to przeczytaj najpierw następny punkt o wskaźnikach, a następnie powróć do czytania tego podpunktu.



Na koniec wykładu o tablicach pozostała nam jeszcze do omówienia jedna rzecz, a mianowicie przekazywanie tablic do funkcji jako jeden z
parametrów. Wiesz już co to są funkcje oraz jak przekazywać do nich zmienne jako ich parametry, tak więc z samą składniową stroną tego
problemu nie powinieneś mieć kłopotów. Jedynym problemem może być zrozumienie istoty przekazywania tablic, ale myślę, że nawet jeśli teraz
tego nie zrozumiesz, to po przeczytaniu następnego punktu zrozumiesz to z pewnością.
Jak zapewne pamiętasz z wcześniejszych punktów, w języku C mamy do czynienia z tzw. przekazywaniem przez wartość parametrów do funkcji.
Znaczyło to tyle, że nawet jeśli w ciele funkcji zmienna, która została do niej przekazana została zmieniona (tzn. przypisano jej nową wartość) to
po powrocie do miejsca wywołania funkcji miała dalej starą wartość. Po prostu w momencie wywołania funkcji została utworzona kopia
zmiennej, która została przekazana jako parametr i zmianom ulegałą właśnie ta kopia, a nie oryginalna zmienna. Od reguły tej jest jednak
pewien wyjątek. Jak się zapewne domyślasz wyjątkiem tym jest przekazywanie do funkcji tablic. Związane jest to z tym, że tablice mogą mieć
na prawdę ogromną wielkość i przy tworzeniu ich kopii mogłoby np. zabraknąć wolnej pamięci. Poza tym samo kopiowanie trwało by dość
długo, a język C był zaprojektowany z myślą o jak najszybszym działaniu programów w nim napisanych. Tablice w języku C nie są więc
przekazywane przez wartość, lecz zamiast tego przekazuje się tzw. wskaźnik do pierwszego elementu. Innymi słowy do funkcji przekazuje się
adres pamięci, pod którym znajduje się pierwszy element tablicy (ułożenie tablicy w pamięci zostało omówione na początku tego punktu).
Aby pokazać sposób w jaki możesz przekazać tablicę do funkcji oraz udowodnić fakt, że nie są one przekazywane przez wartość napisałem
program, który to zademonstruje. Przed dalszą lekturą skompiluj go proszę, uruchom i przyjżyj się uważnie wynikom jego działania.



Kod źródłowy programu







Większość konstrukcji użytych w tym programie powinna być dla Ciebie zrozumiała. Praktycznie wszystko było już użyte w poprzednich
programach, z jednym wyjątkiem, a mianowicie deklaracją pierwszego parametru funkcji Suma jako
tablicy. Przyjrzyj się sposobowi deklaracji - wygląda ona bardzo podobnie jak deklaracja parametru typu prostego. Jedyną różnicą jest to, że
po nazwie podaliśmy jeszcze nawiasy klamrowe. Czyli

int Suma(int tab[], int ilosc)



przeczytamy jako: definicja funkcji o nazwie Suma zwracającej wartość typu int, która przyjmuje dwa
parametry, z których pierwszy jest typu tablica intów i nazywa się tab, natomiast drugi jest typu int i nazywa
się ilość.



Skoro już wiesz wszystko co potrzebne odnośnie składni zastosowanej w programie możemy przejść do jego analizy.
Zaczynamy, jak zwykle, od funkcji main. Początek to nic nowego - deklaracja tablicy intów o wielkości
automatycznie obliczanej przez kompilator oraz deklaracja zmiennej o nazwie ilosc, która tą wielkość
będzie przechowywać. Następnie, przy pomocy funkcji printf, wyświetlamy na ekranie zawartość ostatniego
elementu tablicy oraz ilość elementów w niej zawartych. Następnej linijce będziemy musieli się przyglądnąć dokładniej - zawiera ona
wywołanie funkcji Suma. Wartość, którą ta funkcja zwróciła zostaje przekazana jako parametr do funkcji
main i zostaje wyświetlona na ekranie. Funkcja Suma oblicza sumę
tylu elementów tablicy, która została przekazana jako pierwszy parametr, ile zostało przekazanych jako parametr numer dwa. W naszym
przypadku funkcja ma obliczyć sumę wszystkich (bo zmienna ilość zawiera ilość elementów w tablicy)
tablicy o nazwie... tablica. Przyjżyj się dokładnie sposobowi, w jaki przekazaliśmy oba parametry do funkcji
Suma - po prostu podaliśmy nazwy zmiennych. Skoro wywołaliśmy naszą funkcję to przejdźmy do analizy
jej wnętrza. Początek to nic nowego - sumujemy elementy tablicy w sposób taki, jak w poprzednich programach i uzyskaną wartość
przypisujemy zmiennej o nazwie suma. Wartość tą zwracamy do miejsca wywołania przy użyciu
return w ostatniej linijce ciała funkcji. Jednak we wcześniejszej linijce użyliśmy dwóch przypisań, aby
zaprezentować to, o czym wspomniałem na początku tego podpunktu - tablice są przekazywane przez wskaźnik, w przeciwieństwie do innych
typów przekazywanych przez wartość. Aby to udowodnić do ostatniego elementu tablicy wpisaliśmy liczbę jedenaście (na początku było tam
dwieście), natomiast zmiennej ilosc przypisaliśmy wartość sto (była tam początkowo wartość sześć
ponieważ tyle właśnie jest elementów w naszej tablicy). Po wykonaniu funkcji wyświetlamy ponownie zawartość obu tych danych, aby
sprawdzić czy fakt, że zmodyfikowaliśmy je w funkcji return ma jakiekolwiek znaczenie. A oto jaki jest wynik
wyświetlony na ekranie po uruchomieniu tego programu:

Przed wywolaniem funkcji ostatni element jest rowny 200.
Przed wywolaniem funkcji zmienna ilosc jest rowna 6.
Suma wszystkich elementow jest rowna 340.
Po wywolaniu funkcji ostatni element jest rowny 11.
Po wywolaniu funkcji zmienna ilosc jest rowna 6.



Jak widzisz wynika z tego jednoznacznie, że o ile w przypadku zmiennej ilosc jej wartość w ogóle się nie
zmieniła, to w przypadku tablicy jej wartość uległa zmianie.
Mimo faktu, że język C nie posiada tzw. przekazania przez referencję (czyli odpowiednika var z Pascala) to
jednak sposób, który kompilator wykorzystuje przy przekazywaniu tablic do funkcji, możemy samodzielnie zastosować także w stosunku do
typów prostych przy zastosowaniu tzw. wskaźników. Jest to jednak temat na tyle obszerny, że poświecony zostanie temu zagadnieniu cały
następny punkt.




[<< Tablice wielowymiarowe | Spis treści | Wskaźniki >>]


 






Wyszukiwarka

Podobne podstrony:
T 14
Rzym 5 w 12,14 CZY WIERZYSZ EWOLUCJI
ustawa o umowach miedzynarodowych 14 00
990425 14
foto (14)
DGP 14 rachunkowosc i audyt
Plakat WEGLINIEC Odjazdy wazny od 14 04 27 do 14 06 14
022 14 (2)
index 14
Program wykładu Fizyka II 14 15
14 shtml

więcej podobnych podstron