Podręcznik
Wersja podręcznika: 1.0
Data publikacji: 01.01.2022 r.
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.