ПОРТАЛ ПРОГРАММИСТОВ
Как фоpмулиpуется пpинцип pазбоpа сложных синтаксических констpукций языка Си, навpоде "указатель на функцию, возвpащающую указатель на массив из тpёх указателей на функции, возвpащающие значение int"?


Существует правило разбора, которое называется "право-лево".

Всё предельно просто. Имеем:

* () - функция, возвращающая...

* [] - массив из...

* * - указатель на...

Процесс разбора итеративный:

1. Первым делом находим имя, от которого и будем плясать. Пляски начинаются со слов "Имя есть..."

2. Следующий шаг - шаг вправо. Что там у нас справа? Если (), то говорим, что "Имя есть функция, возвращающая...". (если промеж скобок что-то есть, то "Имя есть функция, принимающая то, что между скобок, и возвращающая...") Если там [], то "Имя есть массив из..." И таким вот образом мы идём вправо до тех пор, пока не дойдём до конца объявления или правой ) скобки. Тут тормозим...

3. ...и начинаем танцевать влево. Что у нас слева? Если это что-то не из приведённой выше таблицы (то есть не (), [], *), то просто добавляем к уже имеющейся расшифровке. Если же там что-то из этих трёх символов, то добавляем то, что написано в таблице. И так танцуем до тех пор, пока не дотанцуем до конца (точнее - начала объявления) или левой ( скобки. Если дошли до начала, то всё готово. А если дошли до (, то по уже означенной итеративности переходим к шагу 2 - пляски вправо продолжаем.

Пример:

        int (*(*(*fptr)())[3])();
                  ^^^^


1. Hаходим имя и записываем "fptr есть..."

2. Шаг вправо, но там ), потому идём влево


        int (*(*(*fun)())[3])();
                 ^


и получаем "fptr есть указатель на..."

3. Продолжаем ехать влево, но тут (. Идём вправо


        int (*(*(*fun)())[3])();
                      ^^


получаем "fptr есть указатель на функцию, возвращающую..." Снова ), опять влево.

4. Получаем


        int (*(*(*fun)())[3])();
               ^


"fptr есть указатель на функцию, возвращающую указатель на..." Слева опять (, идём вправо.

5. Получаем


        int (*(*(*fun)())[3])();
                         ^^^


"fptr есть указатель на функцию, возвращающую указатель на массив из трёх..." И снова справа ), отправляемся влево

6. Получаем

        int (*(*(*fun)())[3])();
             ^


"fptr есть указатель на функцию, возвращающую указатель на массив из трёх указателей на..." Снова разворот вправо по причине (

7. Получаем


        int (*(*(*fun)())[3])();
                             ^^


"fptr есть указатель на функцию, возвращающую указатель на массив из трёх указателей на функции, возвращающие..." Тут конец описания, поехали влево и получили окончательную расшифровку этой каракули 8.


        int (*(*(*fun)())[3])();
        ^^^


"fptr есть указатель на функцию, возвращающую указатель на массив из трёх указателей на функции, возвращающие int"

Всё!