2012-01-18 11 views
49

Sono stato confuso con quello che vedo sulla maggior parte dei programmi C che ha una dichiarazione di funzione non familiare per me.Qual è la funzione di un asterisco prima del nome di una funzione?

void *func_name(void *param){ 
    ... 
} 

Che cosa implica la funzione per *? La mia comprensione di (*) in un tipo di variabile è che crea un puntatore a un'altra variabile, quindi può essere in grado di tenere traccia dell'indirizzo a cui quest'ultima variabile è memorizzata. Ma in questo caso di una funzione, non so cosa significhi questo asterisco *.

+4

Sarebbe una domanda molto interessante chiedere alla persona che ha scritto il codice perché inserisce l'asterisco accanto al nome della funzione, piuttosto che "void * func_name" o "void * func_name". Se riescono a trovare un ragionamento razionale perché, sarei colpito. – Lundin

+8

Argomento razionale: perché siamo abituati a scrivere "int * a", quindi sembra più coerente fare lo stesso per le funzioni – Guillaume

+1

In aggiunta a ciò che Guillaume ha scritto, la funzione è un puntatore che deve essere annullato. come con 'int * a' è un puntamento a un intero che non è di tipo intero-puntatore. – dhein

risposta

58

L'asterisco appartiene al tipo di ritorno, e non il nome della funzione, cioè .:

void* func_name(void *param) { . . . . . } 

Ciò significa che la funzione restituisce un vuoto puntatore.

+10

grazie per le risposte ragazzi ma cosa vuol dire un puntatore vuoto ? – Aldee

+6

È solo un indirizzo di una posizione in memoria. Non sai a cosa punta - spetta a te lanciare il puntatore su un tipo corretto che puoi usare in un secondo momento. Ovviamente, convertendolo in un tipo non valido (ad esempio, diciamo che void * punta a un float, ma lo lanci a un char) genererà risultati non definiti. –

+1

@AldeeMativo: vedi anche http://stackoverflow.com/questions/692564/concept-of-void-pointer-in-c-programming – NPE

10

Il * appartiene al tipo di reso. Questa funzione restituisce void *, un puntatore a qualche posizione di memoria di tipo non specificato.

Un puntatore è un tipo variabile di per sé che ha l'indirizzo di qualche posizione di memoria come valore. I diversi tipi di puntatore in C rappresentano i diversi tipi che ci si aspetta di risiedere nella posizione di memoria a cui si riferisce la variabile puntatore. Quindi un int * si riferisce a un luogo che può essere interpretato come. Ma un void * è un tipo di puntatore che fa riferimento a una posizione di memoria di tipo non specificato. Dovrai lanciare un puntatore vuoto per poter accedere ai dati nella posizione di memoria a cui si riferisce.

5

Significa che la funzione restituisce un void*.

+1

cioè che funcction restituisce un puntatore generico. –

16

Il * si riferisce al tipo di ritorno della funzione, che è void *.

Quando si dichiara una variabile puntatore, è la stessa cosa per mettere il * vicino al nome della variabile o il tipo di variabile:

int *a; 
int* a; 

personalmente considero la prima scelta più chiaro, perché se si vuole definire più puntatori utilizzando il separatore ,, si dovrà ripetere il * ogni volta:

int *a, *b; 

con il "vicino al tipo di sintassi" può essere fuorviante in questo caso, perché se si scrivere:

int* a, b; 

si dichiara un puntatore a int (a) e un int (b).

Quindi, troverete anche la sintassi nei tipi di ritorno funzione!

+0

sì. Anche io la penso così. grazie @puller .. – Aldee

+3

"se vuoi definire più puntatori usando l'operatore,". Questo è considerato uno stile di programmazione scadente poiché porta a bug quando si combinano puntatori e variabili dello stesso tipo. La soluzione non è quella di offuscare il modo in cui decidi i puntatori, la soluzione è dichiarare _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ Non esiste alcun caso in cui abbia senso dichiarare più variabili sulla stessa riga. Cosa stai cercando di ottenere facendo così, salvare le pressioni della tastiera? Chiaramente, l'usura della tastiera è una questione più seria della leggibilità del codice ... – Lundin

+1

Non ho mai detto di farlo. Ho detto che è un motivo preferire la sintassi "close-to-variable-name", perché non crea mai confusione. E ho detto che è una possibile spiegazione per la stessa sintassi utilizzata nelle interfacce di funzione. –

Problemi correlati