Interpretación de puntero de función desordenada

Me encuentro con la siguiente función de puntero.

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

Parece una matriz de punteros de función en el siguiente formato, pero no puedo ver qué significa f -> (* x ()). ¿Cómo interpretar este puntero de función desordenado?

 char (*f[])(); 

ADICIONAL

Con la ayuda de John Bode, hago un ejemplo de la siguiente manera.

 #include  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]()); } 

Podría obtener el resultado esperado.

 smcho @ prosseek temp2> ./a.out 
 una
 segundo

Y, puedes encontrar una mejor implementación aquí .

Mi procedimiento general es encontrar el identificador de más a la izquierda en la statement y luego trabajar a mi manera, recordando que [] y () unen antes de * (es decir, *f() normalmente se analiza como *(f()) y *a[] normalmente se analiza como *(a[]) ).

Asi que,

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

¿Cómo se vería semejante bestia en la práctica?

 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}; 

La expresión &funclist devolverá un puntero a la matriz, por lo que

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

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

 char (*f[])(); 

En este caso f is an array of pointer to function returning char

Usar la regla derecha-izquierda sería beneficioso.

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

Unos cuantos typedefs lo hacen más claro:

 typedef char (*charfunc_t)(); 

Esto define a charfunc_t como un puntero a una función sin argumentos que devuelve char .

 typedef charfunc_t funcarr_t[]; 

funcarr_t es una matriz de tales punteros de función.

x es una función que devuelve un puntero a dicha matriz y ahora se puede declarar así:

 funcarr_t* x(); 

Visite este sitio para ayudarlo a comprender las declaraciones c ( cdecl.org ), si escribe lo anterior, le dirá esto

declare x como función que devuelve el puntero a la matriz de puntero a la función que devuelve carácter