8 - Wskaźniki do funkcji

Ikona obiektów Cele lekcji
Nauka posługiwania się wskaźnikami do funkcji

Ikona obiektów Co powinieneś już wiedzieć?
  • Jak zadeklarować i wywołać funkcję.
  • Jakposługiwać się wskaźnikami.

Ikona obiektów Wskaźniki do funkcji

Podobnie jak nazwa tablicy jest wskaźnikiem do pierwszego elementu tej tablicy, nazwa funkcji jest wskaźnikiem do funkcji. Można zadeklarować zmienną wskaźnikową wskazującą na funkcję i wywołać tę funkcję za pomocą tej zmiennej. Określenie typu takiego wskaźnika polega na podaniu typu argumentów funkcji oraz jej wyniku i wygląda następująco:

typ_zwracany (* nazwa)(lista_typów_parametrów);

Na przykład, poniższy kod tworzy wskaźnik do funkcji przyjmującej jeden parametr całkowity i zwracającej wynik całkowity. Następnie pod ten wskaźnik podstawiona jest funkcja obliczająca wartość bezwzględną liczby.

int (*funkcja)(int);
funkcja=abs;
int x;
scanf("%d",&x);
printf("%d",funkcja(x));


Ikona obiektów Przykład - funkcja qsort

Przykładem zastosowania wskaźników do funkcji może być sortowanie tablicy. W zależności od tego, jakiego typu elementy znajdują się w tablicy, powinniśmy użyć różnych funkcji porównujących te elementy. Do sortowania danych można wykorzystać znajdującą się w bibliotece stdlib.h funkcję qsort o następującej składni:

void qsort(void *tab, size_t num, size_t size, int (*comparator)(const void *, const void *))

Kolejne argumenty funkcji qsort to:

  • wskaźnik na pierwszy element tablicy, którą chcemy posortować
  • liczba elementów, które mamy posortować
  • rozmiar (w bajtach) pojedynczego elementu tablicy
  • wskaźnik do funkcji porównującej elementy tablicy. Funkcja ta przyjmuje dwa wskaźniki i zwraca liczbę całkowitą. Jeśli element wskazywany przez pierwszy wskaźnik powinien być w posortowanej tablicy przed elementem wskazywanym przez drugi wskaźnik, to funkcja powinna zwrócić wartość ujemną. Jeśli to drugi element powinien pojawić się w tablicy najpierw, funkcja powinna zwrócić wartość dodatnią. Jeśli oba elementy mogą wystąpić w tablicy w dowolnej kolejności (czyli są w pewnym sensie równe), funkcja powinna zwrócić 0.

Ikona obiektu Zastanów się
Jak może wyglądać funkcja porównująca używana do posortowania rosnąco tablicy liczb typu int przez funkcję qsort?