Odpowiedzi już na to, ale chciałem podejść do tego w odwrotny sposób.
Deklaracja funkcji wygląda tak samo jak deklaracja zmiennej, z tym że nazwa zmiennej jest zamieniana przez nazwę funkcji i parametry.
Więc ta deklaruje bar
jako wskaźnik do funkcji, która zajmuje się int
i zwraca int
:
int (*bar)(int);
jeśli zamiast zmiennej bar
, to funkcja foo(int)
z tej wartości powrotnej, wymienić bar
z foo(int)
i otrzymujemy:
int (*foo(int))(int);
// ^^^^^^^^
// this was "bar" before
Dodaj niepotrzebnego parę nawiasów i masz:
int ((*foo(int)))(int);
// ^ ^
// extra parentheses
Ponieważ nikt o tym nie wspomniał, http://c-faq.com/decl/spiral.anderson.html. Zapamiętywanie niektórych prostych zasad pozwala łatwo rozwikłać każdą deklarację. – chris
@chris; Nie uniwersalna zasada. W niektórych przypadkach nie działa. – haccks
@haccks: Nie mogę wymyślić przykładów, w których zawodzi z mojej głowy ... Czy mógłbyś rozwinąć? – wolfPack88