2012-08-26 13 views
5

Capisco come decadono gli array ai puntatori. Capisco che, per il compilatore, questo:Sintassi di array e sintassi del puntatore nei parametri di funzione C

void foo(int *arg1); 

è al 100% equivale a questo:

void foo(int arg1[]); 

Qualora uno stile da preferire sopra l'altro? Voglio essere coerente, ma ho difficoltà a giustificare entrambe le decisioni.

Anche se int main(int argc, char *argv[]) e int main(int argc, char **argv) sono uguali, il primo sembra essere molto più comune (correggimi se sbaglio).

+3

Se l'obiettivo è la coerenza, è necessario utilizzare l'asterisco, poiché ciò è coerente con le normali dichiarazioni (non parametriche). L'altra sintassi dovrebbe morire, non causa altro che confusione. –

risposta

7

Si consiglia di rispetto a utilizzando la sintassi [] per i parametri di funzione.

L'unico argomento a favore dell'utilizzo di [] è che implica, in modo auto-documentante, che il puntatore punta a più di una cosa. Per esempio:

void swap(int *x, int *y) 
double average(int vals[], int n) 

Ma allora perché è char * sempre utilizzato per le stringhe piuttosto che char []? Preferirei essere coerente e usare sempre *.

Alcune persone amano const tutto ciò che possono, inclusi i parametri del pass-by-value. La sintassi per che quando si utilizza [] (disponibile solo in C99) è meno intuitivo e probabilmente meno noto:

const char *const *const words vs. const char *const words[const]

Anche se io ritengo che finale const essere eccessivo, in ogni caso.

Inoltre, il modo in cui gli array decadono non è completamente intuitivo. In particolare, è not applied recursively (char words[][] non funziona). Soprattutto quando inizi a lanciare più indirette, la sintassi [] causa solo confusione. IMO è meglio utilizzare sempre la sintassi del puntatore piuttosto che fingere che un array venga passato come argomento.

Altre informazioni: http://c-faq.com/~scs/cgi-bin/faqcat.cgi?sec=aryptr#aryptrparam.

+0

è più sicuro usare [] questa sintassi quindi * una? –

+0

Cosa intendi con sicurezza? – mk12

+0

Voglio dire al sicuro da potenziali pericoli di puntamento –

3

Tranne char*, io uso Type array[N], dove N è un numero o una costante definita, quando l'elemento passato concettualmente è una matrice (cioè, contiene N> 1 elementi), Type * pointer quando l'elemento passato è un puntatore esattamente un oggetto

Tendo ad utilizzare std::vector se la matrice è di dimensioni variabili. Il concetto di C99 di array di dimensioni variabili non è disponibile in C++.

+0

Ma il 'N' è silenziosamente ignorato, che trovo fuorviante. –

+0

@KeithThompson: sei corretto; il compilatore lo ignora. Tuttavia, non stai solo scrivendo per il compilatore, stai anche scrivendo per l'utente umano del tuo codice. Il fatto che gli array decadano in puntatori è uno dei maggiori difetti in C/C++ dal punto di vista di un programmatore scientifico. Non vi è alcun motivo per inchinarsi a quell'enorme difetto. –

+0

E se avessi un puntatore a un array di stringhe (ad esempio puntatore char per la stringa, puntatore a puntatore char per le parole, puntatore a puntatore al puntatore char per consentire alla funzione di scriverle)? 'char * (* words [])'? IMO 'char *** words' sembra migliore ed è più facile da capire a colpo d'occhio. Suppongo, però, che questo genere di cose sia più comune in C (che sono principalmente interessato a) rispetto al C++, però. – mk12

Problemi correlati