124 ROZDZIAŁ 17. WSKAŹNIKI określone miejsce w pamięci. A ponieważ funkcja ma swój adres 6, to nie ma przeszkód, aby i na nią wskazywał jakiś wskaźnik. Deklaracja wskaźnika na funkcję 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 rodzajów wskaźników. Jedną z głównych różnic jest jego deklaracja. Zwykle wygląda ona tak: typ_zwracanej_wartości (*nazwa_wskaźnika)(typ1 parametr1, 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ę: #include int suma (int a, int b) { return a+b; } int main () { int (*wsk_suma)(int a, int b); wsk_suma = suma; printf("4+5=%d\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 kom- pilator, że chodzi nam o adres funkcji 2. wskaźnika używamy tak, jak normalnej funkcji, na którą on wskazuje Do czego można użyć wskaźników na funkcje? Język C jest językiem strukturalnym, jednak dzięki wskaźnikom istnieje w nim możliwość “zaszczepienia” pewnych obiektowych właściwości. Wskaźnik na funkcję może być np. ele- mentem struktury — wtedy mamy bardzo prymitywną namiastkę klasy, którą dobrze znają programiści, piszący w języku C++. Ponadto dzięki wskaźnikom możemy tworzyć mechani- zmy działające na zasadzie funkcji zwrotnej 7. 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: struct urzadzenie { int (*otworz)(void); void (*zamknij)(void); }; int moje_urzadzenie_otworz (void) { 6Tak naprawdę kod maszynowy utworzony po skompilowaniu programu odnosi się właśnie do adresu funkcji. 7Funkcje zwrotne znalazły zastosowanie głównie w programowaniu GUI
... zobacz całą notatkę
Komentarze użytkowników (0)