2010-09-14 5 views
17

Diese Frage folgt this other question about C declarations. Lesen Sie die Antwort auf diese Frage, ich las über die spiral rule und ich verstand auch, was "Erklärung folgt Verwendung" bedeutet.Spiralregel und 'Deklaration folgt Verwendung' zum Analysieren von C- und C++ - Deklarationen

Ok soweit. Aber dann las ich this declaration:

char *(*(*a[N])())(); 

und ich habe mich gefragt, wie es mit dem analysieren „Erklärung folgt usage“ ‚Regel‘. Speziell für den Array-Teil.

Was ich lese ist:

(*(*a[N])()) 

eine Funktion ist () Rückkehr ein char *, dann dereferencing die folgende

(*a[N])() // 1 

ist diese 'Funktion einer char* Rückkehr', und so 1 ein 'Zeiger auf eine Funktion char * zurück' dann würde ich sagen 'wenn (*a[N]) aufgerufen wird, ist es [vorherige Erklärung]'. An dieser Stelle haben wir (*a[N]) ist eine Funktion, die einen Zeiger auf eine Funktion zurückgibt char * zurückgibt.

Aber dann weiß ich nicht, wie man diese Regel anwendet, um zwischen dem "Zeiger auf Feld" und "Feld des Zeigers" zu unterscheiden.

Kann jemand das klären?

Andere Frage: Was sind die Regeln der "Vorrang" in solchen Deklarationen, zwischen & (in C++), * und []? [Maybe „Vorrang“ ist nicht der richtige Begriff]


Um zu überprüfen, ob ich die ‚Spirale der Regel‘ richtig verstanden, ich diesen Ausdruck auch unten analysieren; Bitte sag mir, wenn ich falsch liege.

 +-----------+ 
     | +------+ | 
     | | +-+ | | 
     | |^| | | 
char* (*(* a[N])())(); 
    ^^^^^^
    | | | | | | 
    | | +---+ | | 
    | +--------+ | 
    +--------------+ 

Für mich ist es einfacher (loop durch loop):

  • a ist ein Array von N ...
  • Zeiger Zurückkehren zu funktionieren ...
  • Zeiger auf Funktion zurückkehr ...
  • char *

Aber vielleicht verpasse ich etwas, was mir in diesem Fall die richtige Antwort geben könnte, aber das könnte in einem komplizierteren Fall falsch sein.

+0

@Vality: Wenn Sie das C++ - Tag löschen möchten, müssen Sie auch in C++ auf "&" verzichten. –

+0

@JonathanLeffler Guter Punkt, Normalerweise würde ich sagen, dass dies in zwei Fragen aufgeteilt werden muss, aber es ist eine so alte Frage, die ich nicht will. – Vality

+0

@Vality Wie kommt die Frage plötzlich so viel Aufmerksamkeit auf sich? (Ich wurde für das Abzeichen "nette Frage" benachrichtigt). –

Antwort

12

Sie müssen es nur in Schritten aufbauen.

char *X(); // X =~ (*(*a[N])()) 

Funktion Rückkehr char*

char *(*Y())(); // Y =~ (*a[N]) 

Funktion Rückkehr Zeiger auf Funktion char* zurück.

In einer Erklärung, wie in einem Ausdruck (Erklärung Folge usage), Postfix [] hat eine höhere Priorität, die so **a[N] entsprechen *(a[N]) unären, nicht (*a)[N].

Zeiger zu Funktion, Zeiger auf Funktion zurückgeben char*.

char *(*(*a[N])())(); 

Array von N Zeigern auf Funktionen einen Zeiger zurückkehr char* funktionieren zurückkehrt.