Regel zum Lesen behaarter Deklarationen: Finde den äußersten linken Bezeichner und arbeite dich nach außen, bedenke, dass ()
und []
bind vor *
, also T *a[N]
ist ein Array von Zeigern auf T
, T (*a)[N]
ist Ein Zeiger auf ein Array von T
, T *f()
ist eine Funktion, die einen Zeiger auf T
zurückgibt, und T (*f)()
ist ein Zeiger auf eine Funktion, die T zurückgibt. Da ein Funktionsprototyp Parameternamen auslassen kann, sehen Sie möglicherweise Dinge wie T *[N]
oder T (*)()
. Die Bedeutung ist meistens die gleiche 1 , nur so, als ob es eine Kennung von 0 Länge gäbe.
Also,
%Vor% Wichtig ist hier, dass Sie p
als Array von ...
deklarieren, keine Funktion, die ...
zurückgibt.
Wie würde solch ein Biest in der Praxis aussehen? Nun, zuerst brauchen Sie drei Funktionen, auf die Sie zeigen können. Jede dieser Funktionen nimmt einen einzelnen Parameter, der ein Zeiger auf eine Funktion ist, die einen Zeiger auf void zurückgibt:
%Vor% Jeder von foo
, bar
und bletch
würde die Funktion aufrufen und irgendwie einen Zeiger auf double
zurückgeben.
Sie möchten auch eine oder mehrere Funktionen definieren, die den Parametertyp für foo
, bar
und bletch
:
Wenn Sie also foo
direkt aufrufen, nennen Sie es wie
So könnten wir uns einen Anruf wie
vorstellen %Vor%1 - der Unterschied besteht darin, dass im Zusammenhang mit einer Funktionsparameterdeklaration
T a[]
und T a[N]
identisch mit T *a
sind; In allen drei Fällen ist a
ein Zeiger auf T
, nicht ein Array von T
. Beachten Sie, dass dies in einer Funktionsparameterdeklaration nur ist . Daher ist T *[]
identisch mit T **
.
Verwenden Sie einfach Ссылка :
deklariere p als Feld 3 des Zeigers, um zu funktionieren (Zeiger auf Funktion, der Zeiger auf void zurückbringt), der Zeiger auf doppelt zurückgibt
Weitere Informationen finden Sie in diesem MSDN-Artikel: Interpretieren komplexerer Deklaratoren .
Aber typedefs würde helfen:
%Vor% (Verwenden Sie natürlich anstelle von foo
und bar
geeignete Namen!)
Ihr p
ist ein Array von 3 Zeigern für eine Funktion, die einen double
-Zeiger zurückgibt und als Argument einen Zeiger auf eine andere Funktion verwendet, die einen void
-Zeiger zurückgibt und no akzeptiert Argumente.
Verwenden Sie diese Syntax nicht , versuchen Sie stattdessen typedef.
Es ist ein Array (der Größe 3) von Funktionszeigern, das einen Zeiger auf double zurückgibt und einen anderen Funktionszeiger als Argument verwendet.
Art der Funktion, deren Zeiger im Array gespeichert werden kann: double *(func)(void* (*)())
Art der Funktion, deren Zeiger als Argument an func übergeben werden kann: void *(func1)(void)
"Es gibt eine Technik, die als" Clockwise / Spiral Rule "bekannt ist und jedem C-Programmierer erlaubt, jede C-Deklaration in seinem Kopf zu analysieren!"
Spiralregel im Uhrzeigersinn - Ссылка