8. Funkcje

8.5. Wskaźniki do funkcji

Wskaźnik na funkcję to ... jak się łatwo domyśleć – adres w pamięci, gdzie zaczyna się jakaś funkcja. To chyba dość oczywiste – zmienne mają adresy, bo są umieszczone w obszarze pamięci przeznaczonym na dane. Funkcje też mają adresy – bo są umieszczone w obszarze pamięci przeznaczonym na program. Jak z nich skorzystać? Całkiem prosto. Po pierwsze – nazwa funkcji standardowo może zostać zinterpretowana jako adres – wystarczy, że napiszemy ją bez nawiasów i argumentów na końcu. Dlatego też poniższy kod jest poprawny:


double funkcja(double (*wskaznik_na_funkcje)(double), double x)
{
  double wynik;
  wynik = (*wskaznik_na_funkcje) (x);
  return (wynik);
}
cout << funkcja(sin, 1.75)  << funkcja(cos, 1.75);

To co zrobiliśmy – to po prostu wykorzystaliśmy funkcję pomocniczą, która przyjmuje dwa argumenty. Drugi z nich to zwykła liczba zmiennoprzecinkowa. A pierwszy – to właśnie wskaźnik na funkcję. Definicja wskaźnika na funkcję jest bardzo podobna do definicji wskaźnika na zmienną. Zobaczcie:


/** Definicja wskaźnika na funkcję przyjmującą jeden parametr
typu double i zwracającą jedną wartość takiego samego typu.
Od tego momentu będzie istniała zmienna wskaźnikowa (przechowująca
adres) o nazwe func. */
double (*func)(double);

func = sin;  /// przypisanie do zmiennej adresu funkcji sin
a = func(1.74); /// wywołanie funkcji wskazywanej
func = cos;
b = func(1.74);

Można także skorzystać z tablicy wskaźników na funkcje - deklaracja tablicy wygląda tak:


double (*funkcje[4])(double);
funkcje[0] = sin;
funkcje[1] = cos;
funkcje[2] = tan;
funkcje[3] = ctg;

Jak widzicie – nie ma w tym jakiejkolwiek magii czy problemów składniowych. Z doświadczenia wiem, że największym problemem jest zrozumienie i zaakceptowanie faktu, iż funkcja też może być zmienną ... więc jednak zrobiliśmy krok w kierunku programowania funkcyjnego. No to pora na krok następny.