Беспорядочная интерпретация указателя на функцию

Я случайно наткнулся на следующий указатель на функцию.

char (*(*x())[])();

Это выглядит как массив указателей на функции в следующем формате, но я не могу понять, что означает f -> (*x()). Как интерпретировать этот беспорядочный указатель функции?

char (*f[])();

ADDED

С помощью Джона Боде я делаю пример следующим образом.

#include <stdio.h>

char foo()    { return 'a'; }
char bar()    { return 'b'; }
char blurga() { return 'c'; }
char bletch() { return 'd'; }

char (*gfunclist[])() = {foo, bar, blurga, bletch};

char (*(*x())[])()
{
  static char (*funclist[4])() = {foo, bar, blurga, bletch};
  return &funclist;
}

int main() 
{
  printf("%c\n",gfunclist[0]());

  char (*(*fs)[4])();
  fs = x();
  printf("%c\n",(*fs)[1]()); 
}

Я мог бы получить ожидаемый результат.

smcho @ prosseek temp2>./a.out 

б

И вы можете найти лучшую реализацию здесь.

5 ответов

Решение

Моя общая процедура состоит в том, чтобы найти самый левый идентификатор в объявлении, а затем найти выход, помня, что [] а также () связать перед * (То есть, *f() обычно анализируется как *(f()) а также *a[] обычно анализируется как *(a[])).

Так,

          x           -- x
          x()         -- is a function
         *x()         -- returning a pointer
        (*x())[]      -- to an array
       *(*x())[]      -- of pointers
      (*(*x())[])()   -- to functions
 char (*(*x())[])();  -- returning char

Как будет выглядеть такой зверь на практике?

char foo()    { return 'a'; }
char bar()    { return 'b'; }
char blurga() { return 'c'; }
char bletch() { return 'd'; }

/**  
 *           funclist           -- funclist
 *           funclist[]         -- is an array
 *          *funclist[]         -- of pointers
 *         (*funclist[])()      -- to functions
 *    char (*funclist[])()      -- returning char
 */    
char (*funclist[])() = {foo, bar, blurga, bletch};

Выражение &funclist вернет указатель на массив, так

char (*(*x())[])()
{
  return &funclist;
}
char (*(*x())[])();

x is a function returning pointer to array of pointer to function returning char

char (*f[])();

В этом случае f is an array of pointer to function returning char

Использование правила справа налево было бы полезно.

cdecl> explain char (*(*x())[])();
declare x as function returning pointer to array of pointer to function returning char

Несколько typedefs делают это понятнее:

typedef char (*charfunc_t)();

Это определяет charfunc_t быть указателем на функцию без аргументов, которая возвращает char,

typedef charfunc_t funcarr_t[];

funcarr_t массив таких указателей на функции

x является функцией, возвращающей указатель на такой массив, и теперь она может быть объявлена ​​так:

funcarr_t* x();

Посетите этот сайт, чтобы помочь вам понять c декларации ( ht tp://www.cdecl.org/), если вы введете выше, он скажет вам это

объявить x как функцию, возвращающую указатель на массив указателей на функцию, возвращающую char

Другие вопросы по тегам