2012-10-29 1 views
5

possiamo passare un array come una variabile in un colpo di testa funzione di C/C++, come inC/C++ variabile di matrice nell'intestazione funzione

int func(int arr[]) { ... } 

mi chiedo: è mai possibile che qualcosa va all'interno della [] in una variabile passata nell'intestazione della funzione o è sempre vuota?

+1

Non fa differenza finché non si utilizza un riferimento, un puntatore all'array o una matrice multidimensionale. – chris

+0

È diverso per C e C++. C ha VLA. C++ ha modelli. –

+1

* "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. –

risposta

10

per qualsiasi (non di riferimento) tipo T, le firme funzione R foo(T t[]) e R foo(T t[123]) (o qualsiasi altro numero) sono identici a R foo(T * t), e gli array sono passati per passare l'indirizzo della prima elemento.

Nota che T può essere un tipo di matrice, ad esempio T = U[10].

+1

+1 per l'astrazione. Non l'ho mai sentito così, ma è buono. – chris

2

per un array monodimensionale, sarà sempre vuoto, le parentesi sono un altro modo di scrivere:

int fun(int * arr) 
{ 

} 

Come per una matrice bidimensionale, è necessario specificare il numero di elementi ciascuno dell'elemento stesso detiene

int fun(int arr[][3]) 
{ 

} 
+2

Può avere un numero tra parentesi, anche se è unidimensionale, il compilatore lo ignora semplicemente. – imreal

2

int func (int arr []) {...} è una declassazione non valida di un array passato a una funzione.

Un nome di matrice è una variabile di puntatore. quindi è sufficiente passare il nome dell'array (che è un puntatore)

int func (int * arr) {...} passerà l'indirizzo iniziale dell'array alla funzione in modo che possa usa la matrice.

se la matrice originale deve essere mantenuta intatta, è possibile creare una copia dell'array & utilizzata all'interno della funzione.

+0

Non vero. È un codice valido. – Acorbe

0

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;.