Lekcija: Nizovi kao argumenti funkcije
Parametri funkcija mogu da budu i nizovi. Pri navođenju takvog parametra nije neophodno navesti broj elemenata niza. Uz ime parametra dovoljno je navesti samo [ ] što označava da se radi o nizu, a ne o nekom drugom tipu podatka. Opšti oblik navođenja parametra koji je niz je:
tip ime [ ]
Tip predstavlja tip elemenata niza, ime je identifikator parametra, a zagrade označavaju da se radi o nizu.
Prilikom pozivanja funkcije, stvarni argument treba da je samo ime niza, čiji su elementi istog tipa kakav je tip elemenata parametra. Naglasak je na tome da uz ime stvarnog argumenta ne treba i NE SME da stoji zagrada [ ]. Takođe, je greška uz ime navesti indeks (kao na primer niz [ i ] ), jer to predstavlja element niza, a ne niz.
Primer:
#include <stdio.h>
int zbir(int a[], int n) /* zbir elemenata niza */
{
int i, s=0;
for(i=0;i<n;i++) s=s+a[i];
return s;
}
int main(void)
{
int niz[30], d, i, z;
printf("Unesi duzinu niza: ");
scanf("%d",&d);
printf("\n Unesi elemente niza: ");
for(i=0;i<d;i++) scanf("%d",&niz[i]);
z = zbir(niz, d); /*pozivanje funkcije */
printf("Zbir elemenata niza je %d", z);
return 0;
}
Prvi parametar funkcije zbir je niz celih brojeva, a drugi parametar predstavlja broj elemenata niza. Nizovni parametar se unutar funkcije koristi kao bilo koji niz.
Prilikom pozivanja funkcije zbir , kao prvi parametar je navedeno samo ime niza koji postoji u glavnom programu. Ne smeta što ime stvarnog argumenta niz nije jednak parametru a. Bitno je da oba imaju elemente istih tipova. Fizička veličina niza koji se navede kao stavrni argument nema, takođe, nikakav značaj. Ista funkcija može da se poziva nizovima različitih veličina.
Ime drugog argumenta u glavnom programu je odabrano tako da se razlikuje od imena odgovarajućeg parametra koji je napisan prilikon definicije funkcije zbir. I u slučaju običnih tipova podataka, bitno je slaganje tipova a ne imena.
Ranije je prilikom objašnjavanja nizova rečeno da, ako se navede ime niza a ne napiše se zagrada sa indeksom, onda se radi o početnoj adresi niza. Pošto kao argument funkcije treba navesti samo ime niza, iz toga sledi da se nizovi u funkcije prenose isključivo pomoću adrese. To ima smisla, pošto nizovi mogu da imaju vrlo veliki broj elemenata, pa bi njihovo kopiranje prilikom pozivanja funkcija trajalo dugo i tražilo bi dosta dodatne memorije.
S obzirom da se u funkciju prenosi samo početna adresa niza, u samoj funkciji je potpuno nebitno koliko će elemenata imati niz koji će se navesti kao stvarni argument prilikom pozivanja funkcije. Zbog toga je pri definisanju nizovnog parametra dovoljno samo upotrebiti zagrade [ ], čime je označeno da se radi o nizu, a da se pri tome ne navede kolika je dužina tog niza.
NAPOMENA: Nema načina da se u funkciji proveri koliko elemenata ima niz koji je naveden kao stvarni argument. Ako pokušate da pristupite nepostojećem elementu niza, može svašta da se desi. Dozvoljeni opseg indeksa za pristupanje elementima niza je od 0 do duz-1, gde je duz fizička dužina niza koja je navedena prilikom definisanja niza.
Pošto je ime niza u stvari pokazivač na početak niza, iz toga proizilazi i to da, ako je parametar funkcije niz elemenata nekog tipa, stvarni argument može da bude i pokazivač na podatke tipa elemenata tog niza.
Pošto su indeksiranje niza i indirektno adresiranje pomoću pokazivača u stvari iste operacije (niz[i] je isto što i * ( niz+i ) ), iz toga proizilazi da menjanje vrednosti elemenata nizovnog parametra proizvodi bočne efekte. Drugim rečima, ako se u funkciji menja sadržaj nizovnog parametra, promene će se desiti u stvarnom argumentu koji je naveden prilikom pozivanja funkcija, tj.izvan funkcije !!!