Jest zasada: http://ieng9.ucsd.edu/~cs30x/rt_lt.rule.html
skrócie, należy zacząć od identyfikatora, a następnie analizować wszystko z identyfikatorem w prawo (może to być ()
- funkcja lub []
tablica), a następnie przeanalizować wszystko od identyfikatora lewo. Nawiasy zmienia ten porządek - należy przeanalizować wszystko w najbardziej wewnętrznych nawiasach pierwszy i tak dalej, to działa jak z obliczeń arytmetycznych.
Innymi słowy, nie jest kolejność pierwszeństwa (która może być zmieniana w nawiasach) z wyższego do niższego:
1) ()
- funkcja i []
- tablicy od lewej w prawo;
2) *
- wskaźnik, typ, rodzaj modyfikatora, od prawej do lewej.
Twój przykład
int (*ptr)(char (*ch)[])
Zaczynamy od identyfikatora
int (*ptr)(char (*ch)[]); // (1)ptr
|_|
1
Identifier ptr
jest w nawiasie, więc analizować wszystko parenteses pierwszych
(*ptr) // (1)ptr
|_|
1
Nic w prawo, więc analizować w lewo
(*ptr) // (1)ptr is (2)a pointer
||_|
2 1
Skończyliśmy w nawiasach, teraz analizować po prawej nawiasach
int (*ptr)(char (*ch)[]); // (1)ptr is (2)a pointer to (3)function
||_| |____________|
2 1 3
Dotychczas ignorowanie argumentów funkcji i analizowania z lewej nawiasach
int (*ptr)(char (*ch)[]); // (1)ptr is (2)a pointer to (3)function which returns (4)int
|_| ||_| |____________|
4 2 1 3
w ten sam sposób analizowania argument funkcji (mam wstawione jakieś przestrzenie dla lepszego dopasowania)
char (* ch)[ ] // (1)ch is (2)a pointer to (3)array of (4)chars
|___| | |_| |_|
4 2 1 3
Wreszcie mamy:
ptr jest wskaźnik do funkcji, która zwraca int i przyjmuje wskaźnik do tablicy znaków jako argument
Był to jeden obszar C że projektanci dostał strasznie źle źle! –
To prawda! Trudno jest ocenić takie wyrażenia .. – RDX
To jest błąd składniowy. –