Ich habe zwei Zeigererklärungen gefunden, bei denen ich Probleme mit dem Verständnis habe. Mein Verständnis der Vorrangregeln sieht ungefähr so aus:
Operator Precedence Associativity
(), [ ] 1 Left to Right
*, identifier 2 Right to Left
Data type 3
Aber trotz alledem kann ich nicht herausfinden, wie man die folgenden Beispiele richtig bewertet:
Erstes Beispiel
float * (* (*ptr)(int))(double **,char c)
Meine Bewertung:
*(ptr)
(int)
*(*ptr)(int)
*(*(*ptr)(int))
Dann,
double **
char c
Zweites Beispiel
unsigned **( * (*ptr) [5] ) (char const *,int *)
*(ptr)
[5]
*(*ptr)[5]
*(*(*ptr)[5])
**(*(*ptr)[5])
Wie soll ich sie lesen?
Antworten:
Meine Vermutung für die ersten : ptr ein Zeiger auf eine Funktion , die als Parameter einen int nimmt, und gibt einen Zeiger auf eine Funktion , die als Parameter einen Zeiger auf Zeiger nimmt zu verdoppeln und ein char, und gibt einen Zeiger zu schweben.
Interpretation :
(* ptr) (int)
sagt, dass ptr ein Zeiger auf eine Funktion ist, die ein int als Argument verwendet. Um herauszufinden, was diese Funktion zurückgibt, müssen wir unsere Ansicht erweitern:
(* (* ptr) (int))
Dies bedeutet, dass die Funktion einen Zeiger auf eine andere Funktion zurückgibt. Die Parameter dieser anderen Funktion sind:
(double **, char c)
und es kehrt zurück
float *
Und für die zweite : ptr ist ein Zeiger auf ein Array von fünf Zeigern auf Funktionen, die einen konstanten Zeiger auf char und einen Zeiger auf int als Parameter verwenden und einen Zeiger auf einen Zeiger von int ohne Vorzeichen zurückgeben.
Interpretation :
(* (* ptr) [5])
deklariert ptr als Zeiger auf ein Array von fünf Zeigern auf eine Funktion, die nimmt
(char const *, int *)
als Argumente und zurück
ohne Vorzeichen **
quelle
Sie können die Methode 'Die Spirale im Uhrzeigersinn' ausprobieren, um diese wahnsinnigen Erklärungen zu verstehen:
http://c-faq.com/decl/spiral.anderson.html
Ich habe auch hier darüber gebloggt:
http://www.kalekold.net/index.php?post=4
quelle
Es ist ein Funktionszeiger. Die Person, die es geschrieben hat, hätte typedefs besser nutzen können, um es klarer zu machen.
Es ist praktisch ein Zeiger, um mit diesen Parametern zu arbeiten. float * myfunc (double **, char)
quelle
Verwendung von cdecl.org:
Deklarieren Sie bar als const-Zeiger auf Array 5 von pointer to function (int) und geben Sie const-Zeiger auf char zurück
Deklarieren Sie ptr als Zeiger auf Array 5 von Zeiger auf Funktion (Zeiger auf const char, Zeiger auf int) und geben Sie den Zeiger auf Zeiger auf unsigned zurück
quelle