0Pricing
C Academy · Lekcja

Deklarowanie wskaźników do funkcji

Wskaźniki do funkcji

Deklarowanie wskaźników do funkcji to bezpłatna lekcja C Academy na CoddyKit. To lekcja 1 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 mają adresy

Tak jak dane, każda funkcja znajduje się pod określonym adresem w pamięci. Wskaźnik do funkcji przechowuje ten adres, dzięki czemu można wywołać funkcję pośrednio.

#include <stdio.h>

void greet(void) { printf("hello\n"); }

int main(void) {
    void (*fp)(void) = greet;
    fp();
    return 0;
}

Odczytywanie deklaracji

Deklaracja int (*fp)(int) oznacza, że fp jest wskaźnikiem do funkcji przyjmującej argument typu int i zwracającej wartość typu int.

Nawiasy wokół *fp są wymagane.

#include <stdio.h>

int square(int x) { return x * x; }

int main(void) {
    int (*fp)(int) = square;
    printf("%d\n", fp(5));
    return 0;
}

Przypisywanie funkcji

Nazwa funkcji jest konwertowana na jej adres, dlatego fp = square i fp = &square są równoważne.

#include <stdio.h>

int dbl(int x) { return x * 2; }

int main(void) {
    int (*fp)(int);
    fp = &dbl;
    printf("%d\n", fp(7));
    return 0;
}

Wywoływanie przez wskaźnik

Funkcję można wywołać przez wskaźnik do funkcji za pomocą fp(args) lub jawnego zapisu (*fp)(args). Oba sposoby działają tak samo.

#include <stdio.h>

int add1(int x) { return x + 1; }

int main(void) {
    int (*fp)(int) = add1;
    printf("%d\n", fp(10));
    printf("%d\n", (*fp)(10));
    return 0;
}

Sygnatura musi pasować

Typ wskaźnika do funkcji obejmuje typ zwracanej wartości oraz typy parametrów. Można przypisać wyłącznie funkcję, której sygnatura dokładnie pasuje.

#include <stdio.h>

double half(double x) { return x / 2.0; }

int main(void) {
    double (*fp)(double) = half;
    printf("%f\n", fp(9.0));
    return 0;
}

Ponowne przypisywanie w czasie działania

Wskaźnik do funkcji jest zmienną, więc podczas działania programu można kierować go na różne funkcje.

#include <stdio.h>

int inc(int x) { return x + 1; }
int dec(int x) { return x - 1; }

int main(void) {
    int (*op)(int) = inc;
    printf("%d\n", op(5));
    op = dec;
    printf("%d\n", op(5));
    return 0;
}

Wybór zależny od warunku

Należy wybrać funkcję do wywołania na podstawie wartości znanej w czasie działania programu, a następnie wywołać ją przez jeden wskaźnik.

#include <stdio.h>

int plus(int a) { return a + 10; }
int minus(int a) { return a - 10; }

int main(void) {
    int up = 1;
    int (*op)(int) = up ? plus : minus;
    printf("%d\n", op(100));
    return 0;
}

typedef dla czytelności

Składnia wskaźników do funkcji jest rozwlekła. Konstrukcja typedef nadaje typowi nazwę, dzięki czemu deklaracje stają się czytelniejsze.

#include <stdio.h>

typedef int (*IntOp)(int);

int triple(int x) { return x * 3; }

int main(void) {
    IntOp op = triple;
    printf("%d\n", op(4));
    return 0;
}

Funkcje z dwoma argumentami

Wskaźniki do funkcji mogą opisywać dowolną sygnaturę. Oto wskaźnik dla dwuargumentowej operacji na liczbach całkowitych.

#include <stdio.h>

int sum(int a, int b) { return a + b; }

int main(void) {
    int (*op)(int, int) = sum;
    printf("%d\n", op(3, 4));
    return 0;
}

Pusty wskaźnik do funkcji

Podobnie jak wskaźniki do danych, wskaźnik do funkcji może mieć wartość NULL. Przed wywołaniem wskaźnika, który może nie być ustawiony, należy zawsze to sprawdzić.

#include <stdio.h>

int twice(int x) { return x * 2; }

int main(void) {
    int (*op)(int) = NULL;
    if (op == NULL) op = twice;
    if (op) printf("%d\n", op(8));
    return 0;
}

Wyświetlanie adresu

Można sprawdzić przechowywany adres. Różne funkcje mają różne adresy.

#include <stdio.h>

int f(int x) { return x; }

int main(void) {
    int (*fp)(int) = f;
    printf("function pointer is %s\n", fp ? "set" : "null");
    return 0;
}

Szybki sprawdzian

Sprawdź swoją wiedzę o deklarowaniu wskaźników do funkcji.

Podsumowanie

Dowiedział się Pan / Dowiedziała się Pani, jak deklarować i używać wskaźników do funkcji:

  • Składnia: ret (*name)(params) z wymaganymi nawiasami.
  • Przypisanie za pomocą nazwy funkcji, która jest konwertowana na adres.
  • Wywołanie za pomocą fp(args) lub (*fp)(args).
  • Sygnatura musi pasować; konstrukcja typedef poprawia czytelność.

Często zadawane pytania

Czy lekcja „Deklarowanie wskaźników do funkcji” jest bezpłatna?

Tak — pełny tekst „Deklarowanie wskaźników do 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 „Deklarowanie wskaźników do funkcji”?

Wskaźniki do funkcji Ć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 1 z 4.

Ile czasu zajmuje lekcja „Deklarowanie wskaźników do 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