¿Cómo se determina la precedencia en los punteros C?

14

Me he encontrado con dos declaraciones de puntero que me cuesta 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 teniendo en cuenta esto, no puedo encontrar la manera de evaluar correctamente los siguientes ejemplos:

Primer ejemplo

float * (* (*ptr)(int))(double **,char c)

Mi evaluación:

  1. *(ptr)
  2. (int)
  3. *(*ptr)(int)
  4. *(*(*ptr)(int))

Entonces,

  1. double **
  2. char c

Segundo ejemplo

unsigned **( * (*ptr) [5] ) (char const *,int *)
  1. *(ptr)
  2. [5]
  3. *(*ptr)[5]
  4. *(*(*ptr)[5])
  5. **(*(*ptr)[5])

¿Cómo debería leerlos?

    
pregunta trapaank 21.11.2011 - 21:20

4 respuestas

7

Mi conjetura para la primera : 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 char, y devuelve un puntero a 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 devuelve

flotar *

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 unsigned int.

Interpretación :

(* (* ptr) [5])

declara ptr como un puntero a la matriz de cinco punteros a una función que toma

(char const *, int *)

como argumentos y devoluciones

sin firmar **

    
respondido por el Daniel Scocco 21.11.2011 - 21:46
7

Puedes probar el método 'La espiral en el sentido de las agujas del reloj' para entender estas locas declaraciones:

enlace

También escribí sobre esto aquí:

enlace

    
respondido por el Gary Willoughby 21.11.2011 - 21:33
1

Es un puntero de función. La persona que lo escribió podría haber hecho un mejor uso de typedefs para hacerlo más claro.

En efecto, es un puntero que funciona con estos parámetros.     float * myfunc (double **, char)

    
respondido por el Michael Shaw 21.11.2011 - 21:42

Lea otras preguntas en las etiquetas