2012-03-16 14 views
6

ho scritto una funzione che prende un puntatore ad un array di inizializzare i suoi valori:Puntatore alla matrice come parametro di funzione

#define FIXED_SIZE 256 
int Foo(int *pArray[FIXED_SIZE]) 
{ 
/*...*/ 
} 

//Call: 

int array[FIXED_SIZE]; 
Foo(&array); 

E non può essere compilato:

errore C2664: 'Foo': non può convertire il parametro 1 da 'int (* __ W64) [256]' a 'int * []'

Tuttavia, ho violato questo insieme:

typedef int FixedArray[FIXED_SIZE]; 
int Foo(FixedArray *pArray) 
{ 
/*...*/ 
} 

//Call: 

FixedArray array; 
Foo(&array); 

E funziona. Cosa mi manca nella prima definizione? Ho pensato che la due sarebbe equivalente ...

risposta

13
int Foo(int *pArray[FIXED_SIZE]) 
{ 
/*...*/ 
} 

Nel primo caso, pArray è un array di puntatori, non un puntatore a un array.

È necessario parentesi di usare un puntatore a un array:

int Foo(int (*pArray)[FIXED_SIZE]) 

si ottiene questo gratuitamente con l'typedef (dal momento che è già un tipo, il * ha un significato diverso). In altre parole, il tipo typedef viene fornito con le proprie parentesi.

Nota: l'esperienza mostra che nel 99% dei casi in cui qualcuno utilizza un puntatore a un array, , potrebbe e dovrebbe effettivamente utilizzare un puntatore al primo elemento.

+0

Sì, puntatore al primo elemento e alla dimensione (se necessario, che probabilmente è). –

+0

Mi hai battuto per questo! – Mosby

0

Un array decade in un puntatore. Quindi, funziona nel secondo caso. Mentre nel primo caso, il parametro function è un array di puntatori ma non un puntatore al numero intero che punta al primo elemento nella sequenza.

2

Una cosa semplice è quello di ricordare la regola in senso orario a spirale, che si trova a http://c-faq.com/decl/spiral.anderson.html

che valuterebbe il primo a essere un array di puntatori. Il secondo è puntatore ad array di dimensioni fisse.

Problemi correlati