• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Wskaźniki do funkcji

Object Storage Arubacloud
0 głosów
787 wizyt
pytanie zadane 28 maja 2018 w C i C++ przez periedynek Obywatel (1,320 p.)

Cześć, mam pytanie, ponieważ nie moge zrozumiec ani nie znalazłem żadnej konkretnej odpowiedzi.

Po co się używa wskaźników do funkcji?

Np:

char *czytajPlik(FILE * f)
{
...
}

Kompletnie tego nie rozumiem.

2
komentarz 28 maja 2018 przez draghan VIP (106,230 p.)
To co pokazałeś jako przykład, nie jest wskaźnikiem na funkcję ("do funkcji") .

Możesz potwierdzić, że pytasz, do czego używa się wskaźników zwracanych z funkcji, jako parametr funkcji, czy rzeczywiście chodzi Ci o wskaźnik pokazujący na funkcję?
komentarz 28 maja 2018 przez periedynek Obywatel (1,320 p.)

Wskaźnik pokazujący na funkcję. Nie chodzi mi o parametry.

W sensie chodzi mi konkretnie o ten kawałek: 

char *czytajPlik(...) 
{
...
}

char *czytajPlik <<

 

2
komentarz 28 maja 2018 przez draghan VIP (106,230 p.)
To nie jest wskaźnik na funkcję, tylko funkcja zwracająca typ char*, czyli w założeniu pewnie jakiś łańcuch znaków (zawartość pliku?).
komentarz 28 maja 2018 przez periedynek Obywatel (1,320 p.)

Hmm, to moze myle pojecia.

W takim razie jak  by wyglądał wskaźnik na funkcję?

 

A w moim przykładzie, dlaczego akurat musi być tam w takim razie wskaźnik, dlaczego nie może być tak: 

char czytajPlik(FILE* f)
{
...
}

Bo bez tego wskaźnika nie działa.

komentarz 28 maja 2018 przez draghan VIP (106,230 p.)

A w moim przykładzie, dlaczego akurat musi być tam w takim razie wskaźnik, dlaczego nie może być tak:  (...)

Bo bez tego wskaźnika nie działa.

Bo ktoś napisał tę funkcję w taki sposób, żeby zwracała char* ("łańcuch znaków", wskaźnik zapewne do tablicy znakowej), a nie pojedynczy znak.

Przykładowy wskaźnik na funkcję wygląda tak:

int function(char single_character_parameter, int int_parameter)
{
 /// ...
}

int main()
{
    // definicja wskaźnika:
    int (*pointer_to_function)(char, int) = function;
    // użycie wskaźnika na funkcję:
    int i = pointer_to_function('a', 123);
}

 

komentarz 28 maja 2018 przez periedynek Obywatel (1,320 p.)
ahhh rozumiem ten mój przykład.

 

A jeżeli chodzi o wskaźnik na funkcje, to do czego mozna tego uzyc?
1
komentarz 28 maja 2018 przez draghan VIP (106,230 p.)

A jeżeli chodzi o wskaźnik na funkcje, to do czego mozna tego uzyc?

Możesz mieć taki wskaźnik przypisany do jakieś funkcji i w trakcie działania programu, np. w wyniku jakiegoś działania użytkownika, przypisać do takiego wskaźnika inną funkcję. Możesz trzymać tablicę takich wskaźników żeby np. zrobić generyczne menu. Systemy callbacków również wykorzystują podobne mechanizmy.

1
komentarz 29 maja 2018 przez j23 Mędrzec (194,920 p.)

@periedynek, można użyć na przykład w funkcji sortującej -> link

 

1 odpowiedź

+1 głos
odpowiedź 29 maja 2018 przez mokrowski Mędrzec (155,460 p.)
#include <iostream>
#include <functional>
#include <vector>

double multiply(double a, double b) {
    return a * b; 
}

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

int main() {
    // Wskaźnik na funkcję "w stylu C" o nazwie funcPtr
    // double (*funcPtr)(double a, double b);
    // 
    // "Surowa tablica" wskaźników na takie funkcje
    double (*funcTable1[])(double, double) = { multiply, sum };
    // I wywołanie takiej funkcji
    std::cout << funcTable1[0](10, 20) << '\n';

    // Oczywiście nieco łatwiej będzie zdefiniować typ 
    // takiego wskaźnika
    typedef double(*funcPtrType)(double, double);
    // .. i go użyć np. w tablicy
    funcPtrType funcTable2[] = { sum, multiply };
    // i wywołanie
    std::cout << funcTable2[0](12, 12) << '\n';

    // Dzięki takiej konstrukcji można łatwo definiować np. prostą maszynę stanów
    // lub wykonywać obliczenia leniwie czyli dopiero w momencie gdy obliczenia 
    // są absolutnie niezbędne.

    // ALE...
    // Po co się tak męczyć jeśli od C++11 dostępny typ dla obiektów wywoływanych...
    std::vector<std::function<double(double, double)>> vecFunct{ multiply, sum,
        [](double a, double b) { // Lambda także... 
            return a * 2 + b;
        }
    };
    std::cout << vecFunct[2](12, 33) << '\n';
}

 

Podobne pytania

0 głosów
2 odpowiedzi 842 wizyt
pytanie zadane 16 marca 2020 w C i C++ przez Hubertius Bywalec (2,970 p.)
0 głosów
1 odpowiedź 129 wizyt
pytanie zadane 16 marca 2020 w C i C++ przez Quanti994 Początkujący (340 p.)
0 głosów
1 odpowiedź 249 wizyt
pytanie zadane 4 stycznia 2017 w C i C++ przez Dawid Sobierajski Nowicjusz (170 p.)

92,551 zapytań

141,393 odpowiedzi

319,522 komentarzy

61,936 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...