8 - Wskaźniki do funkcji


- Jak zadeklarować i wywołać funkcję.
- Jakposługiwać się wskaźnikami.

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));

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.
