0Pricing
C Academy · Lekcja

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 typedef do 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

  1. Deklarowanie wskaźników do funkcji
  2. Przekazywanie funkcji
  3. qsort z komparatorami
  4. Tabele wskaźników do funkcji
← Powrót do C Academy