Me he encontrado con dos declaraciones de puntero que tengo problemas para entender. Mi comprensión de las reglas de precedencia es algo como esto:
Operator Precedence Associativity
(), [ ] 1 Left to Right
*, identifier 2 Right to Left
Data type 3
Pero incluso dado esto, parece que no puedo entender cómo evaluar los siguientes ejemplos correctamente:
Primer ejemplo
float * (* (*ptr)(int))(double **,char c)
Mi evaluación:
*(ptr)
(int)
*(*ptr)(int)
*(*(*ptr)(int))
Luego,
double **
char c
Segundo ejemplo
unsigned **( * (*ptr) [5] ) (char const *,int *)
*(ptr)
[5]
*(*ptr)[5]
*(*(*ptr)[5])
**(*(*ptr)[5])
¿Cómo debería leerlos?
Respuestas:
Mi conjetura para el primero : ptr es un puntero a una función que toma como parámetro un int, y devuelve un puntero a una función que toma como parámetros un puntero a puntero para duplicar y un carácter, y devuelve un puntero para flotar.
Interpretación :
(* ptr) (int)
dice que ptr es un puntero a una función que toma un int como argumento. Para descubrir qué devuelve esa función, necesitamos expandir nuestra vista:
(* (* ptr) (int))
Esto significa que la función devuelve un puntero a otra función. Los parámetros de esa otra función son:
(doble **, char c)
y vuelve
flotador *
Y para el segundo : ptr es un puntero a una matriz de cinco punteros a funciones que toman como parámetros un puntero constante a char y un puntero a int, devolviendo un puntero a un puntero de int sin signo.
Interpretación :
(* (* ptr) [5])
declara ptr como puntero a una matriz de cinco punteros a una función que toma
(char const *, int *)
como argumentos y volviendo
sin firmar **
fuente
Puede probar el método 'La espiral en sentido horario' para comprender estas declaraciones locas:
http://c-faq.com/decl/spiral.anderson.html
También escribí un blog sobre esto aquí:
http://www.kalekold.net/index.php?post=4
fuente
Es un puntero de función. La persona que lo escribió podría haber hecho un mejor uso de typedefs para haberlo aclarado.
En efecto, es un puntero para funcionar con estos parámetros. float * myfunc (doble **, char)
fuente
Usando cdecl.org:
declarar la barra como puntero constante al conjunto 5 del puntero para funcionar (int) devolviendo el puntero constante a char
declare ptr como puntero a la matriz 5 del puntero para funcionar (puntero a const char, puntero a int) devolviendo puntero a puntero a unsigned
fuente