2013-01-01 22 views
16

La mia domanda è molto semplice.sintassi puntatore funzione C

normalmente, quando si dichiara una variabile, si mette il tipo prima di esso, come:

int a; 

un puntatore a funzione può avere tipo come: int (*) (int, int), nel caso in cui indichiamo una funzione che accetta due int e restituisce un int. Ma, quando si dichiara un tale puntatore, il suo identificatore non è dopo il tipo, come:

int(*)(int,int) mypointer; 

invece, è necessario scrivere l'identificatore nel mezzo:

int(*mypointer)(int,int); 

perché è così? Scusa, so che è una domanda imbarazzante facile ...

Grazie a tutti per aver risposto. A.S.

+3

Questo non è l'unico caso, si utilizza anche quello stile nelle dichiarazioni di array. – effeffe

+2

La ricerca per "Dichiarazione riflette l'uso". –

risposta

7

Questa struttura riflette come viene dichiarata (e utilizzata) una funzione normale.

consideri un normale definizione di funzione:

int foo (int bar, int baz, int quux); 

Ora consideriamo la definizione di un puntatore a funzione a una funzione della stessa firma:

int (*foo) (int, int, int); 

Notate come le due strutture speculari tra loro? Questo rende *foo molto più facile da identificare come puntatore a funzione piuttosto che come qualcos'altro.

11

I spiegare questo nella mia risposta alla Why was the C syntax for arrays, pointers, and functions designed this way?, e si tratta essenzialmente verso il basso per:

la lingua autori preferito fare la sintassi variabile-centrica, piuttosto che di tipo-centric. Cioè, volevano che un programmatore guardasse la dichiarazione e pensasse "se scrivo l'espressione *func(arg), che risulterà in un *arg[N] avrò un float" invece di "func dovrò essere un puntatore a una funzione sta prendendo questo e restituisce quello ".

Le C entry on Wikipedia affermazioni che:

idea di Ritchie era di dichiarare identificatori in contesti simili a loro uso: "dichiarazione riflette l'uso".

... citando p122 di K & R2.

3

Se si ha a che fare con una funzione (non un puntatore a uno), il nome è anche nel mezzo. Funziona come: return-type function-name "(" argument-list ")" .... Ad esempio, in int foo(int), int è il tipo restituito, foo il nome e int l'elenco di argomenti.

Un puntatore a una funzione funziona praticamente allo stesso modo: restituisce il tipo, quindi il nome, quindi l'elenco di argomenti.In questo caso, dobbiamo aggiungere un * per renderlo un puntatore e (poiché lo * per un puntatore è prefisso) una coppia di parentesi per associare il * al nome invece del tipo restituito. Ad esempio, int *foo(int) significherebbe una funzione denominata foo che accetta un parametro int e restituisce un puntatore a un int. Per ottenere * il limite a foo, invece, abbiamo bisogno di parentesi, che danno int (*foo)(int).

Questo diventa particolarmente brutto quando serve una serie di puntatori alle funzioni. In tal caso, la maggior parte delle persone trovano più facile da usare un typedef per il tipo di puntatore, quindi creare una matrice di quel tipo:

typedef int (*fptr)(int); 

fptr array[10]; 
1

che avevo visto in alcuni luoghi i puntatori alle funzioni vengono dichiarate come

int (* foo) (int a, int b);

e in alcuni punti aeb non sono menzionati ed entrambi funzionano ancora.

così int (* foo) (int, int) è anche corretto.

Molto semplice modo che ho trovato da ricordare è come indicato di seguito

funzione supponiamo viene dichiarato come: int funzione (int a, int b); Step1 - semplicemente mette la funzione in paranthases: int (funzione) (int a, int b); Step2- Inserire un * davanti al nome della funzione e modificare il nome: int (* funcPntr) (int a, int b);

PS: Non sto seguendo le linee guida di codifica corrette per la convenzione di denominazione ecc in questa risposta.

Problemi correlati