0Pricing
C++ Academy · Lekcja

Wskaźniki do funkcji

Przekazuj funkcje jako argumenty

Wskaźniki 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.

Czym jest wskaźnik do funkcji?

Wskaźnik do funkcji przechowuje adres funkcji, dzięki czemu można wywołać ją pośrednio lub przekazywać ją jak dane.

  • Typ koduje sygnaturę.
  • Pozwala funkcjom przyjmować zachowanie jako parametr.
#include <iostream>

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

int main() {
    int (*op)(int, int) = add;
    std::cout << op(3, 4) << '\n';
    return 0;
}

Deklarowanie typu

Deklarację int (*op)(int, int) należy odczytywać tak: op jest wskaźnikiem do funkcji przyjmującej dwie wartości typu int i zwracającej wartość typu int. Nawiasy wokół *op są wymagane.

#include <iostream>

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

int main() {
    int (*fn)(int) = square;
    std::cout << fn(5) << '\n';
    return 0;
}

Wywoływanie przez wskaźnik

Wskaźnik do funkcji wywołuje się tak samo jak samą funkcję. Można również jawnie go wyłuskać, ale rzadko jest to potrzebne.

#include <iostream>

void greet() { std::cout << "Hello\n"; }

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

Przekazywanie funkcji jako argumentów

Funkcja może przyjmować parametr będący wskaźnikiem do funkcji, dzięki czemu kod wywołujący może dostarczyć własne zachowanie.

#include <iostream>

int apply(int x, int (*fn)(int)) { return fn(x); }
int doubler(int n) { return n * 2; }

int main() {
    std::cout << apply(10, doubler) << '\n';
    return 0;
}

Wybór w czasie działania

Ponieważ wskaźnik do funkcji jest zmienną, można zdecydować, którą funkcję wywołać podczas działania programu.

#include <iostream>

int add(int a, int b) { return a + b; }
int sub(int a, int b) { return a - b; }

int main() {
    bool wantAdd = true;
    int (*op)(int, int) = wantAdd ? add : sub;
    std::cout << op(8, 3) << '\n';
    return 0;
}

Tablice wskaźników do funkcji

Przechowuj kilka wskaźników do funkcji w tablicy, aby utworzyć prostą tablicę dyspozytorską indeksowaną wartością.

#include <iostream>

int add(int a, int b) { return a + b; }
int mul(int a, int b) { return a * b; }

int main() {
    int (*ops[2])(int, int) = {add, mul};
    std::cout << ops[0](2, 3) << ' ' << ops[1](2, 3) << '\n';
    return 0;
}

Używanie typedef

Składnia wskaźników jest mało czytelna. Alias typedef lub using nadaje typowi czytelną nazwę.

#include <iostream>

using BinOp = int(*)(int, int);
int add(int a, int b) { return a + b; }

int main() {
    BinOp op = add;
    std::cout << op(6, 7) << '\n';
    return 0;
}

Wskaźniki do funkcji i algorytmy

Standardowe algorytmy przyjmują obiekty wywoływalne, a zwykła funkcja może pełnić tę rolę. W tym przypadku predykat zlicza liczby parzyste.

#include <iostream>
#include <vector>
#include <algorithm>

bool isEven(int n) { return n % 2 == 0; }

int main() {
    std::vector<int> v = {1, 2, 3, 4, 5, 6};
    int c = std::count_if(v.begin(), v.end(), isEven);
    std::cout << "Evens: " << c << '\n';
    return 0;
}

Ograniczenie: brak stanu

Zwykły wskaźnik do funkcji nie może przechowywać przechwyconych danych. Jeśli trzeba zachować kontekst między wywołaniami, należy użyć zmiennych globalnych lub przejść do bardziej rozbudowanych obiektów wywoływalnych.

#include <iostream>

int counter = 0;
int next() { return ++counter; }

int main() {
    int (*fn)() = next;
    std::cout << fn() << ' ' << fn() << ' ' << fn() << '\n';
    return 0;
}

Konwersja lambd bez przechwytywania

Lambda, która niczego nie przechwytuje, może niejawnie konwertować się do pasującego wskaźnika do funkcji, co jest przydatne w przypadku małych funkcji definiowanych bezpośrednio w kodzie.

#include <iostream>

int main() {
    int (*fn)(int) = [](int x) { return x + 100; };
    std::cout << fn(1) << '\n';
    return 0;
}

Puste wskaźniki do funkcji

Wskaźnik do funkcji może mieć wartość nullptr, co oznacza, że nie wskazuje niczego. Przed wywołaniem zawsze należy to sprawdzić, aby uniknąć niezdefiniowanego działania programu.

#include <iostream>

int main() {
    int (*fn)(int) = nullptr;
    if (fn) {
        std::cout << fn(5) << '\n';
    } else {
        std::cout << "No function set\n";
    }
    return 0;
}

Szybkie sprawdzenie

Sprawdź swoją wiedzę na temat ograniczeń wskaźników do funkcji.

Podsumowanie

Dowiedziałeś się więcej o wskaźnikach do funkcji:

  • przechowują adres funkcji i wywołuje się je tak jak funkcję
  • pozwalają przekazywać zachowanie jako parametr i tworzyć tablice dyspozytorskie
  • aliasy zwiększają czytelność ich typu
  • nie mogą przechowywać stanu, ale konwertują się do nich lambdy bez przechwytywania

Następnie poznasz std::function, który może przechowywać dowolny obiekt wywoływalny, także taki ze stanem.

Często zadawane pytania

Czy lekcja „Wskaźniki do funkcji” jest bezpłatna?

Tak — pełny tekst „Wskaźniki 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 „Wskaźniki do funkcji”?

Przekazuj funkcje 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 1 z 4.

Ile czasu zajmuje lekcja „Wskaźniki 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. Wskaźniki do funkcji
  2. std::function
  3. std::bind
  4. Wybór obiektów wywoływalnych
← Powrót do C++ Academy