Regla para la lectura de las declaraciones peludas: encontrar el identificador de más a la izquierda y avance hacia afuera , recordando que ()
y []
se unen antes de *
, por lo T *a[N]
es un vector de punteros a T
, T (*a)[N]
es un puntero a un array de T
, T *f()
es una función que devuelve un puntero a T
y T (*f)()
es un puntero a una función que devuelve T. Como un prototipo de función puede omitir nombres de parámetros, puede ver cosas como T *[N]
o T (*)()
. El significado es mayormente el mismo , solo pretende que hay un identificador de 0 de longitud.
Por lo tanto,
p -- p
p[3] -- is a 3-element array
*p[3] -- of pointers
(*p[3]) ( ) -- to functions
(*p[3]) ( (*)()) -- taking a pointer to a function
(*p[3]) ( * (*)()) -- returning a pointer
(*p[3]) (void* (*)()) -- to void
* (*p[3]) (void* (*)()) -- returning a pointer
double* (*p[3]) (void* (*)()); -- to double
Lo importante para llevar aquí es que se está declarando p
como una matriz de ...
, no es una función que devuelve ...
.
¿Cómo sería esa bestia en la práctica? Bueno, primero, necesitas tres funciones para señalar.Cada una de estas funciones tiene un único parámetro, que es un puntero a una función que devuelve un puntero para anular:
double *foo(void *(*)());
double *bar(void *(*)());
double *bletch(void *(*)());
double *(*p[3]) (void *(*)()) = {foo, bar, bletch};
cada uno de foo
, bar
y bletch
sería llamar a la función pasó a ella y de alguna manera devolver un puntero a double
.
También se quiere definir una o más funciones que satisfacen el tipo de parámetro para cada uno de foo
, bar
y bletch
:
void *blurga() {...}
por lo que si usted llama directamente foo
, que se dice que como
double *pv;
...
pv = foo(blurga);
para que pudiéramos imaginar una llamada como
double *pv = (*p[0])(blurga);
1 - la diferencia es que en el contexto de una declaración parámetro de función, T a[]
y T a[N]
son idénticos a T *a
; en los tres casos, a
es un puntero aT
, no una matriz de T
. Tenga en cuenta que esto es solo verdadero en una declaración de parámetro de función. Por lo tanto, T *[]
será idéntico a T **
.
Estoy contento de caminar en el mundo Java ... –
... en lugar de correr en el mundo C? ;-) –
Oli Charlesworth brindó una respuesta genéricamente útil. No cierres – DevSolar