Natknąłem się na dwie deklaracje wskazujące, które trudno mi zrozumieć. Moje rozumienie zasad pierwszeństwa wygląda mniej więcej tak:
Operator Precedence Associativity
(), [ ] 1 Left to Right
*, identifier 2 Right to Left
Data type 3
Ale nawet biorąc to pod uwagę, nie wydaje mi się, aby poprawnie ocenić następujące przykłady:
Pierwszy przykład
float * (* (*ptr)(int))(double **,char c)
Moja ocena:
*(ptr)
(int)
*(*ptr)(int)
*(*(*ptr)(int))
Następnie,
double **
char c
Drugi przykład
unsigned **( * (*ptr) [5] ) (char const *,int *)
*(ptr)
[5]
*(*ptr)[5]
*(*(*ptr)[5])
**(*(*ptr)[5])
Jak powinien ja je czytać?
Odpowiedzi:
Domyślam się do pierwszego : ptr jest wskaźnikiem do funkcji, która przyjmuje jako parametr int, i zwraca wskaźnik do funkcji, która przyjmuje jako parametry wskaźnik do wskaźnika w celu podwojenia znaku i znaku, i zwraca wskaźnik do wartości zmiennoprzecinkowych.
Interpretacja :
(* ptr) (int)
mówi, że ptr jest wskaźnikiem do funkcji przyjmującej int jako argument. Aby dowiedzieć się, co zwraca ta funkcja, musimy rozszerzyć nasz widok:
(* (* ptr) (int))
oznacza to, że funkcja zwraca wskaźnik do innej funkcji. Parametry tej innej funkcji to:
(double **, char c)
i powraca
pływak *
A po drugie : ptr jest wskaźnikiem do tablicy pięciu wskaźników do funkcji, które przyjmują jako parametry stały wskaźnik do char i wskaźnik do int, zwracając wskaźnik do wskaźnika int bez znaku int.
Interpretacja :
(* (* ptr) [5])
deklaruje ptr jako wskaźnik do tablicy pięciu wskaźników do przejmowania funkcji
(char const *, int *)
jako argumenty i powrót
bez znaku **
źródło
Możesz wypróbować metodę „The Clockwise Spiral”, aby zrozumieć te szalone deklaracje:
http://c-faq.com/decl/spiral.anderson.html
Pisałem też o tym tutaj:
http://www.kalekold.net/index.php?post=4
źródło
To wskaźnik funkcji. Osoba, która to napisała, mogłaby lepiej wykorzystać typedefs, aby było to bardziej zrozumiałe.
W efekcie jest to wskaźnik do działania z tymi parametrami. float * myfunc (double **, char)
źródło
Za pomocą cdecl.org:
zadeklaruj słupek jako wskaźnik const do tablicy 5 wskaźnika do funkcji (int) zwracając wskaźnik const do char
zadeklaruj ptr jako wskaźnik do tablicy 5 wskaźnika do funkcji (wskaźnik do const char, wskaźnik do int) zwracając wskaźnik do wskaźnika do unsigned
źródło