Ukazatele na funkce

Deklarace ukazatele na funkci

V jazyku C je při deklaraci proměnné typu ukazatel na funkci nutné vždy specifikovat také počet a typy parametrů funkce a typ návratové hodnoty. Příklad deklaracedefinice:

//     v------v----------- priotita!
double (*p_fdd)(double);
//             ^------^--- typ

FIXME: odkaz na to, jak se čtou deklarátory/typy!!!

Uvědomte si: ( závorky ) představují 4 různé operátory:

  • typ (v deklaraci/definici/přetypování)
  • operátor provedení/zavolání funkce
  • změna priorit, např. a = (3 + 4) * 5;

Proměnná p_fdd je ukazatel na funkci s jedním paramaterm typu double vracející hodnotu typu double. Příklad deklaracedefinice s inicializací:

double polynomA(double x){
   return 3 * x * x + 4 * x - 10;
}
 
double (*p_fdd)(double) = polynomA;

Příklad deklarace pomocí typedef:

typedef double (*P_FDD)(double);
 
P_FDD p_fdd = polynomA;

Práce s ukazatelem na funkci

Příklad přiřazení adresy funkce ukazateli:

p_fdd = polynomA;

Příklady volání funkce pomocí ukazatele:

v = (*p_f)(-1);
v = p_f(-1);

Obě výše uvedené možnosti volání funkce pomocí ukazatele na tuto funkci se nijak neliší, v praxi se používá druhá varianta, která je jednodušší.

Ukazatel na funkci jako parametr funkce

Ukazatele na funkce umožňují vytváření funkcí vyšších řádů, jejichž výpočet je možné za běhu programu modifikovat pomocí funkcí, které jim jsou předány při jejich volání jako parametr. Příklad definice:

double *map(double (*fce)(double), double *vstup, int pocet) {...}

Příklad volání funkce:

double na3(double x){
   return x * x * x;
}
...
pole_vysledku = map(na3, pole_vstupni, velikost_vstupni);
//Příklad použití ukazatele na funkci při volání:
double (*p_na3)(double) = na3;
...
pole_vysledku = map(p_na3, pole_vstupni, velikost_vstupni);

Pole ukazatelů na funkce

Stejně jako u všech dříve zmíněných datových typů, je i z ukazatelů na funkce (se stejným počtem a typy parametrů a stejným typem návratové hodnoty) možné vytvářet pole (i vícerozměrná). Příklad deklarace pole ukazatelů na funkce:

double(*pole_fci[5])(double);

Příklad deklarace s inicializací:

double(*pole_fci[])(double) = {na3, na4, sin, cos, tan};

Příklad deklarace s použitím dříve definovaného typu:

P_FDD pole_fci[] = {na3, na4, sin, cos, tan};

Příklad volání funkce z pole:

vysledek = pole_fci[1](-1);

cc,upol

jazykc/ukazatele-na-funkce.txt · Last modified: 2014/12/03 23:01 (external edit)
CC Attribution-Noncommercial-Share Alike 4.0 International
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0