Przekazywanie funkcji
Callbacki jako argumenty
Przekazywanie funkcji to bezpłatna lekcja C Academy na CoddyKit. To lekcja 2 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej C Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs C Academy zawiera 4 lekcji w sumie.
Funkcje jako argumenty
Ponieważ wskaźnik do funkcji jest po prostu wartością, można przekazać funkcję do innej funkcji. Otrzymana funkcja jest nazywana funkcją zwrotną (callbackiem).
Pozwala to jednej funkcji dostosować część swojego działania.
#include <stdio.h>
int apply(int x, int (*f)(int)) {
return f(x);
}
int square(int x) { return x * x; }
int main(void) {
printf("%d\n", apply(6, square));
return 0;
}Parametr funkcji zwrotnej
Parametr funkcji zwrotnej deklaruje się tak samo jak zmienną będącą wskaźnikiem do funkcji. Wewnątrz funkcji wywołuje się go jak każdą inną funkcję.
#include <stdio.h>
void run_twice(void (*action)(void)) {
action();
action();
}
void beep(void) { printf("beep\n"); }
int main(void) {
run_twice(beep);
return 0;
}Zamiana sposobu działania
Przekazywanie różnych funkcji zwrotnych pozwala uzyskać różne wyniki tej samej funkcji wyższego rzędu.
#include <stdio.h>
int combine(int a, int b, int (*op)(int, int)) {
return op(a, b);
}
int add(int a, int b) { return a + b; }
int mul(int a, int b) { return a * b; }
int main(void) {
printf("%d\n", combine(3, 4, add));
printf("%d\n", combine(3, 4, mul));
return 0;
}Mapowanie tablicy
Funkcja map stosuje funkcję zwrotną do każdego elementu tablicy bezpośrednio w niej.
#include <stdio.h>
void map(int *a, int n, int (*f)(int)) {
for (int i = 0; i < n; i++) a[i] = f(a[i]);
}
int inc(int x) { return x + 1; }
int main(void) {
int a[] = {1, 2, 3};
map(a, 3, inc);
for (int i = 0; i < 3; i++) printf("%d ", a[i]);
printf("\n");
return 0;
}Filtrowanie za pomocą predykatu
Predykat to funkcja zwrotna zwracająca wartość true lub false. Można go użyć do zliczania lub wybierania pasujących elementów.
#include <stdio.h>
int count_if(int *a, int n, int (*pred)(int)) {
int c = 0;
for (int i = 0; i < n; i++) if (pred(a[i])) c++;
return c;
}
int is_even(int x) { return x % 2 == 0; }
int main(void) {
int a[] = {1,2,3,4,5,6};
printf("%d\n", count_if(a, 6, is_even));
return 0;
}Redukowanie do jednej wartości
Funkcja reduce składa tablicę do jednej wartości za pomocą dwuargumentowej funkcji zwrotnej i początkowego akumulatora.
#include <stdio.h>
int reduce(int *a, int n, int init, int (*op)(int,int)) {
int acc = init;
for (int i = 0; i < n; i++) acc = op(acc, a[i]);
return acc;
}
int add(int a, int b) { return a + b; }
int main(void) {
int a[] = {1,2,3,4};
printf("%d\n", reduce(a, 4, 0, add));
return 0;
}Przekazywanie funkcji porównującej
Sortowanie i wyszukiwanie często przyjmują funkcję zwrotną porównującą, dzięki czemu ten sam algorytm działa dla dowolnego porządku.
#include <stdio.h>
int max_by(int a, int b, int (*greater)(int,int)) {
return greater(a, b) ? a : b;
}
int gt(int a, int b) { return a > b; }
int main(void) {
printf("%d\n", max_by(3, 8, gt));
return 0;
}typedef dla typów funkcji zwrotnych
Nadanie typowi funkcji zwrotnej nazwy za pomocą typedef zwiększa czytelność sygnatur funkcji.
#include <stdio.h>
typedef int (*IntFn)(int);
int apply(int x, IntFn f) { return f(x); }
int neg(int x) { return -x; }
int main(void) {
printf("%d\n", apply(5, neg));
return 0;
}Domyślna funkcja zwrotna
Jeśli funkcja zwrotna może mieć wartość NULL, należy zapewnić działanie domyślne, aby wywołujący mógł z niej zrezygnować.
#include <stdio.h>
int apply(int x, int (*f)(int)) {
if (f == NULL) return x;
return f(x);
}
int dbl(int x) { return x * 2; }
int main(void) {
printf("%d\n", apply(9, NULL));
printf("%d\n", apply(9, dbl));
return 0;
}Funkcje zwrotne rozdzielają kod
Funkcje zwrotne pozwalają, aby ogólny algorytm pozostawał niezależny od konkretnej operacji. Biblioteka zapewnia pętlę, a użytkownik dostarcza działanie.
#include <stdio.h>
void for_each(int *a, int n, void (*visit)(int)) {
for (int i = 0; i < n; i++) visit(a[i]);
}
void show(int x) { printf("[%d]", x); }
int main(void) {
int a[] = {7, 8, 9};
for_each(a, 3, show);
printf("\n");
return 0;
}Wybór funkcji zwrotnej w czasie działania
Połącz wybór zależny od warunku z przekazywaniem funkcji: wybierz funkcję zwrotną, a następnie przekaż ją funkcji wyższego rzędu.
#include <stdio.h>
int apply(int x, int (*f)(int)) { return f(x); }
int sq(int x) { return x * x; }
int cube(int x) { return x * x * x; }
int main(void) {
int power = 3;
int (*f)(int) = (power == 2) ? sq : cube;
printf("%d\n", apply(2, f));
return 0;
}Szybki sprawdzian
Sprawdź swoją wiedzę o przekazywaniu funkcji.
Podsumowanie
Dowiedział się Pan / Dowiedziała się Pani, jak przekazywać funkcje jako funkcje zwrotne:
- Deklaruj parametr funkcji zwrotnej tak jak wskaźnik do funkcji.
- Twórz funkcje wyższego rzędu, takie jak map, filter, reduce i for_each.
- Używaj
typedefdo nazywania typów funkcji zwrotnych. - Zabezpieczaj się przed funkcjami zwrotnymi o wartości
NULL, zapewniając działanie domyślne.
Często zadawane pytania
Czy lekcja „Przekazywanie funkcji” jest bezpłatna?
Tak — pełny tekst „Przekazywanie funkcji” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu C Academy, przejdź na CoddyKit PRO. Kurs C Academy zawiera 4 lekcji w sumie.
Co nauczysz się w „Przekazywanie funkcji”?
Callbacki jako argumenty Ćwiczysz C Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.
Czy potrzebuję doświadczenia, aby zacząć C Academy?
Nie wymagamy żadnego doświadczenia. C Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 2 z 4.
Ile czasu zajmuje lekcja „Przekazywanie funkcji”?
Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.
Czy mogę pisać i uruchamiać kod w tej lekcji C Academy?
Tak. Każda lekcja C Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.
Wszystkie lekcje w tym kursie
- Deklarowanie wskaźników do funkcji
- Przekazywanie funkcji
- qsort z komparatorami
- Tabele wskaźników do funkcji