124
ROZDZIAŁ 17. WSKAŹNIKI
określone miejsce w pamięci. A ponieważ funkcja ma swój adres®, to nie ma przeszkód, aby i na nią wskazywał jakiś wskaźnik.
Tak naprawdę kod maszynowy utworzony po skompilowaniu programu odnosi się właśnie do adresu funkcji. Wskaźnik na funkcję różni się od innych rotlzajów wskaźników. Jedną z głównych różnic jest jego deklaracja. Zwykle wygląda ona tak:
typ.zuracanej.wartości (•nazwa.wskaźnika)(typl parametrl, typ2 parametr2);
Oczywiście parametrów może być więcej (albo też w ogóle może ich nie być). Oto przykład wykorzystania wskaźnika na funkcję:
ffinclude <stdio.h>
int suną (int a, int b)
return a+b;
int main O
int (•wsk.suma)(int a, int b); wsk.suna ■ suma;
printf("4*5“Xd\n", wsk.suma(4,5)); return 0;
Zwróćmy uwagę na dwie rzeczy:
1. przypisując nazwę funkcji bez nawiasów do wskaźnika automatycznie informujemy kompilator, że chodzi nam o adres funkcji
2. wskaźnika używamy tak, jak normalnej funkcji, na którą on wskazuje
Język C jest językiem strukturalnym, jednak dzięki wskaźnikom istnieje w nim możliwość “zaszczepienia*' jK-wnych obiektowych właściwości. Wskaźnik na funkcję może być lip. elementem struktury — wtedy mamy lxardzo prymitywną muniastkę klasy, którą dobrze znają programiści, piszący w języku C++. Ponadto dzięki wskaźnikom możemy tworzyć mechanizmy działające na zasadzie funkcji zwrrotnej'. Dobrym przykładem może być np. tworzenie sterowników, gdzie musimy poinformować różne podsystemy, jakie funkcje w naszym kodzie służą do wykonywania określonych czynności. Przykład:
8truct urządzenie { int (*otuorz)(void); void (‘zamknij)(void);
int moje.urzadzenie.otworz (void)
®Tak naprawcie kod maszynowy utworzony po skompilowaniu prognunu odnosi się właśnie do adresu funkcji.
"Funkcje zwrotne znalazły zastosowanie głównie w programowaniu GUI