Come viene determinata la precedenza nei puntatori C?


14

Ho trovato due dichiarazioni di puntatori che non riesco a capire. La mia comprensione delle regole di precedenza va in questo modo:

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?


1
Chiedere come una lingua gestisce le sue funzionalità è in argomento qui.

Risposte:


7

La mia ipotesi per la prima : ptr è un puntatore a una funzione che accetta come parametro un int e restituisce un puntatore a una funzione che accetta come parametri un puntatore a puntatore a doppio e un carattere e restituisce un puntatore a virgola mobile.

Interpretazione :

(* Ptr) (int)

dice che ptr è un puntatore a una funzione che prende un int come argomento. Per scoprire cosa restituisce quella funzione, dobbiamo espandere la nostra vista:

(* (* ptr) (int))

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

(doppio **, carattere c)

e ritorna

galleggiante *

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 senza segno.

Interpretazione :

(* (* ptr) [5])

dichiara ptr come un puntatore a una matrice di cinque puntatori a una funzione presa

(char const *, int *)

come argomenti e ritorno

non firmato **


7

Potresti provare il metodo "La spirale in senso orario" per comprendere queste dichiarazioni folli:

http://c-faq.com/decl/spiral.anderson.html

Ne ho scritto un blog anche qui:

http://www.kalekold.net/index.php?post=4


Grazie per la risposta. Ma nel metodo La spirale oraria da dove cominciare nel mio caso? Negli esempi forniti sul link ci sono esempi semplici. Non sono in grado di abbinare la mia equazione a quel metodo.
trapaank

1
dovresti iniziare dal tuo identificatore: ptr. avrai: "ptr è un puntatore a una funzione che accetta un int e restituisce un puntatore a una funzione che porta un puntatore a un puntatore a un doppio e un carattere e restituisce un puntatore a un float". prova lo spyral e otterrai lo stesso.
Remo.D,

1

È un puntatore a funzione. La persona che l'ha scritto avrebbe potuto usare meglio i typedef per renderlo più chiaro.

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


4
La mia scommessa è che la persona che l'ha scritta è l'insegnante.
mouviciel,

Speriamo che non sia l'insegnante, perché non è necessario conoscere la merda in questo modo. Anche se suppongo che un buon insegnante prima ti darebbe uno schiaffo in faccia con espressioni come queste, lasciandoti grattarti la testa cercando di interpretarle, quindi mostrandoti come usare correttamente typedef.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.