Was bedeutet double * (* p [3]) (void * (*) ()); bedeuten?

8

Ich habe Schwierigkeiten zu verstehen, was die folgende Erklärung bedeutet. Ist diese Deklaration Standard?

%Vor%

Kann mir jemand helfen, die Bedeutung dieser Erklärung zu verstehen?

    
Nick 06.06.2012, 13:11
quelle

5 Antworten

10

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 :

erfüllen %Vor%

Wenn Sie also foo direkt aufrufen, nennen Sie es wie

%Vor%

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 ** .
John Bode 06.06.2012, 13:58
quelle
10

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!)

    
Oliver Charlesworth 06.06.2012 13:12
quelle
2

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.

    
gliderkite 06.06.2012 13:13
quelle
1

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)

    
Jay 06.06.2012 13:14
quelle
0

"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 - Ссылка

    
user138645 09.06.2012 13:58
quelle

Tags und Links