typedef int* iPtr;
iPtr ist der neue int*.
int* (*bar(void))(int,double);
Das deklariert eine Funktion, die heißt bar. Die Funktion hat als Parameter void (also Nichts). Diese Funktion gibt einen Zeiger zurück, der von dem folgenden Typ ist: Eine Funktion mit Argumenten int und double, die einen Zeiger zurück gibt, der aus int zeigt.
Puh! Das wäre ganz schön schwer von Hand zu zerlegen gewesen. Da lobe ich mir doch, dass man mit http://cdecl.ridiculousfish.com/ cheaten kann:
http://cdecl.ridiculousfish.com/?q=int*+(*bar(void))(int%2Cdouble)%3B+
Weiter geht's:
typedef iPtr (*iPtr_f_int_double_t)(int,double);
iPtr_f_int_double_t ist nun ein neuer Name für folgendes Konstrukt:
Ein Zeiger auf eine Funktion, die (int, double) als Argument hat und einen iPtr (also einen int*) zurück gibt. Wir erkennen, dies ist gerade der Rückgabetyp von der Funktion bar, die oben deklariert wurde.
Somit:
iPtr_f_int_double_t bar(void);
Deklariere eine Funktion bar, die void als Argument hat und iPtr_f_int_double_t zurück gibt. Wir erkennen, diese Deklaration ist identisch zu der, die weiter oben gemacht wurde. Aber wesentlich lesbarer. Oben konnte man ja kaum erkennen, was zu den Funktionsparametern gehört und was zum Rückgabetyp.