Как прочесть запись функции с указателем

Изучаю указатели и в одном учебнике нашел вот такое объявление функций:

  1. void (*(*p)(void))(int);
  2. int (*f(void))();

Мне не совсем понятно, как эту запись прочесть. Предполагаю, что в первом случае это "указатель на функцию, принимающую void, результат которой - указатель на функцию, принимающую int. Подскажите кто-нибудь, как правильно?


Ответы (2 шт):

Автор решения: HolyBlackCat

Да, (1) расшифровали правильно.

Объявления нужно начинать читать с середины, с имени переменной или функции. (В ситуациях, когда имени нет, например у безымянного параметра функции, то нужно найти то место, где могло бы быть имя. Проще всего найти на глазок.)

Дальше нужно двигаться сначала до упора вправо (до конца или до закрывающей скобки), потом до упора влево (до начала или до парной открывающей скобки). Если мы были внутри скобок, то повторить оба шага снаружи скобок, столько раз сколько нужно.

         p               // p - это
                                     // Смотрим вправо - там пусто. Смотрим влево.
        *p               // указатель на
       (*p)                          // Пропускаем скобки. Опять смотрим вправо.
       (*p)(void)        // функцию с параметрами (void), возвращающую
                                     // Теперь влево.
      *(*p)(void)        // указатель на
     (*(*p)(void))                   // Пропускаем скобки. Опять смотрим вправо.
     (*(*p)(void))(int)  // функцию с параметрами (int), возвращающую
                                     // Теперь влево.
void (*(*p)(void))(int)  // void

Домашнее задание - повторить то же самое для (2).

→ Ссылка
Автор решения: ueber

Можно использовать сервис https://cdecl.org/.

Тогда:

  • void (*(*p)(void))(int); <=> declare p as pointer to function (void) returning pointer to function (int) returning void.

  • int (*f(void))(); <=> declare f as function (void) returning pointer to function returning int.

→ Ссылка