Come viene determinata la precedenza nei puntatori C?

14

Mi sono imbattuto in due dichiarazioni puntatore che ho difficoltà a capire. La mia comprensione delle regole di precedenza è simile a questa:

Operator             Precedence             Associativity
(), [ ]                  1                  Left to Right
*, identifier            2                  Right to Left
Data type                3

Ma anche dato questo, non riesco a capire come valutare correttamente i seguenti esempi:

Primo esempio

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

La mia valutazione:

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

Poi,

  1. double **
  2. char c

Secondo esempio

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

Come dovrei leggerli?

    
posta trapaank 21.11.2011 - 21:20
fonte

4 risposte

7

La mia ipotesi per il primo : ptr è un puntatore a una funzione che accetta come parametro un int e restituisce un puntatore a una funzione che assume come parametri un puntatore al puntatore al doppio e un char e restituisce un puntatore a float.

Interpretazione :

(* ptr) (int)

dice che ptr è un puntatore a una funzione che accetta un int come argomento. Per scoprire cosa restituisce questa funzione, è necessario espandere la visualizzazione:

(* (* ptr) (int))

significa che la funzione restituisce un puntatore a un'altra funzione. I parametri di quell'altra funzione sono:

(doppio **, char c)

e restituisce

float *

E per il secondo : ptr è un puntatore a un array di cinque puntatori a funzioni che prendono come parametri un puntatore costante a char e un puntatore a int, restituendo un puntatore a un puntatore di int unsigned

Interpretazione :

(* (* ptr) [5])

dichiara ptr come puntatore a una matrice di cinque puntatori a una funzione che richiede

(char const *, int *)

come argomenti e ritorno

senza segno **

    
risposta data 21.11.2011 - 21:46
fonte
7

Potresti provare il metodo "The Clockwise Spiral" per comprendere queste pazze dichiarazioni:

link

Ne ho parlato anche qui:

link

    
risposta data 21.11.2011 - 21:33
fonte
1

È un puntatore a funzione. La persona che l'ha scritta potrebbe aver fatto un uso migliore dei typedef per renderlo più chiaro.

È in effetti un puntatore per funzionare con questi parametri.     float * myfunc (double **, char)

    
risposta data 21.11.2011 - 21:42
fonte

Leggi altre domande sui tag