Il nome di un array decade in un puntatore al suo primo elemento nella maggior parte dei contesti. Così, quando si scrive
void f(int arr[]);
void g(int arr[42]);
il nome arr
decade in un puntatore a int. Le due dichiarazioni sono equivalenti a questi:
void f(int *arr);
void g(int *arr);
Due luoghi dove il nome non decadimento sono nella definizione di un array e come argomento a sizeof
. Quindi questa dichiarazione in ambito globale non definisce un puntatore a int:
int arr[];
Dico questo particolare uno perché si tratta di un errore facile da fare e uno che è difficile da rintracciare. Questo definisce una matrice, non un puntatore, anche se il numero di elementi non è specificato. Si tratta di un errore (ma che non deve essere diagnosticato) per fare riferimento a arr
da un altro file di origine come int *arr;
.
fonte
2012-10-30 12:55:13
Non fa differenza finché non si utilizza un riferimento, un puntatore all'array o una matrice multidimensionale. – chris
È diverso per C e C++. C ha VLA. C++ ha modelli. –
* "Possiamo passare un array come variabile in un'intestazione di funzione C/C++, come in *" - No. Nel tuo esempio la funzione ottiene un puntatore al primo elemento, non a un array. Prova tu stesso; 'sizeof arr == sizeof int *', sempre. –