6. Ukazovatele a funkcie
6.2 Parametre volané odkazom (referenciou)
Ak chceme vo funkcii zmeniť hodnotu skutočného
parametra, musíme použiť volanie odkazom. Ale ako, veď sme ešte pred
chvíľou tvrdili, že v C volanie odkazom ako také neexistuje? To je
pravda. Tento problém vyriešime pomocou pointerov. Volanie
odkazom v jazyku C nie je v skutočnosti volanie odkazom, tak
ako to poznáme z Pascalu, keď sa formálny parameter označí
kľúčovým slovom var. V tomto prípade kompilátor zaistí, že
sa pri volaní podprogramu do zásobníku odovzdá adresa premennej (adresa
skutočného parametra), ktorá má byť zmenená. Vo funkcii (procedúre) sa
potom s formálnym parametrom pracuje bežným spôsobom - teda
bez akýchkoľvek trikov s pointermi. Kompilátor sám zaistí, že sa
napr. priraďovacím príkazom, nebude meniť hodnota v zásobníku, ale
hodnota skutočného parametra. Aj keď si v C musíme na dosiahnutie
rovnakého výsledku pomôcť pointermi, pre zjednodušenie budeme aj tu
používať termín volanie odkazom.
Vráťme sa k nášmu príkladu, tento raz však hodnotu skutočného parametra vo funkcii nastav zmeníme:
void nastav(int *x)
{
*x = 0;
printf("x ma hodnotu %d\n", *x);
}
int main(void)
{
int x = 1;
printf("x ma hodnotu %d\n", x);
nastav(&x);
printf("x ma hodnotu %d\n", x);
return(0);
}
| Na výstupe teraz máme:
x má hodnotu 1
x má hodnotu 0
x má hodnotu 0
Ako parameter sa vo volaní nastav(&x) odovzdáva adresa premennej x.
Vo vnútri funkcii nastav pracujeme s pointerom!
|
Práve sme pomocou pointera zrealizovali "volanie odkazom." Všimnite si ale, že v C je toto "volanie odkazom" opäť len volanie hodnotou,
keď sa v zásobníku vytvorí lokálna kópia pre uloženie parametra
- adresy skutočného parametra. Táto lokálna premenná síce zaniká
s ukončením príslušnej funkcie, ale má tú vlastnosť, že je
v nej uložený pointer, pomocou ktorého sa nepriamo zmenia údaje,
ktoré nemajú s touto funkciou nič spoločného - boli definované mimo
tejto funkcie a nezanikajú s jej koncom. Teda výsledok je rovnaký
ako pri skutočnom volaní odkazom v Pascale, ale postup spracovania iný.
To čo v Pascale uskutočňoval automaticky kompilátor vďaka
kľúčovému slovu var, to musíme v C urobiť sami - teda
nepracovať s formálnym parametrom ako s normálnou premennou,
ale ako s pointerom.
|