9. Ukazovatele a polia
9.5 Pole ako parameter funkcie
Pole môže byť samozrejme aj parametrom funkcie.
Skutočný parameter sa do funkcie potom odovzdáva odkazom - pomocou
mena poľa sa vlastne odovzdá adresa jeho začiatku. Nesmieme teda
zabudnúť na to, že prvky poľa môžeme vo funkcii meniť a táto zmena je
trvalá - pracujeme s originálom poľa, nie s jeho
lokálnou kópiou.
Funkcia, ktorá usporiada prvky poľa reálnych čísel podľa veľkosti môže mať funkčný prototyp:
void tried(double a[], int pocet);
alebo
void tried(double *a, int pocet);
Oba zápisy vyjadrujú to isté: "Od tejto adresy začína pole a".
Uprednostňuje sa prvý spôsob, lebo je na prvý pohľad jasné, že ide o
pole a nie o obyčajný pointer na double.
Možno sa čudujete nad tým, čo znamená ten druhý parameter pocet .
Ide o počet prvkov poľa. Ak totiž vo funkcii pracujeme
s poľom, potrebujeme poznať jeho veľkosť. Ak pracujeme
s poliami, ktorých veľkosť nie je konštantná (napr. definovaná
symbolickou konštantou v úvode programu takto: #define POCET 50 ),
musíme ju funkcii oznámiť použitím ďalšieho parametra. Z adresy
prvého prvku totiž nie je možné veľkosť poľa určiť, funkcia len "vie"
kde pole začína.
Na utriedenie prvkov poľa stačí už len použiť niektorý zo známych algoritmov napr. triedenie priamym výberom:
void tried(double a[], int pocet)
{
int i, j, min;
double pom;
for (i = 0; i < pocet - 1; i++) {
min = i;
for (j = i + 1; j < pocet; j++) {
if (a[i] < a[min]) min = i;
}
}
pom = a[min];
a[min] = a[i];
a[i] = pom;
}
Vo funkcii main funkciu tried zavoláme takto (na tom, či a je pole statické alebo dynamické nezáleží):
...
tried(a, pocet);
...
|