2013-02-18 11 views
5

Mi chiedevo quale di questi è il migliore quando passo un array come parametro?Array come parametro

void function(int arr[]) {...}; 

o

void function(int* arr) {...}; 

Potrebbe dirmi il motivo? e a quale libro potresti riferirti? Grazie!

+0

Quando si passa un array per il funzionamento decade come puntatore al primo elemento dell'array. Quindi entrambi sono identici. –

+0

Di questi? 'void function (std :: string const & str) {...};' è il migliore. – Johnsyweb

+0

Letture consigliate: http://stackoverflow.com/a/4810672/78845 – Johnsyweb

risposta

4

Dal momento che questa questione è aggiunto , vorrei utilizzare nessuno dei due. Se si utilizza , entrambi sono equivalenti.

Ma dal momento che si utilizza C++, un approccio migliore è quello di utilizzare un std::vector per questi compiti

void function(std::vector<int> &arr) {...} 

o, se non si modifica la matrice/vettore

void function(const std::vector<int> &arr) {...} 
1

Sono semanticamente identici.

# 1 è leggermente migliore (secondo me) perché rende esplicito il passaggio di una matrice.

+3

Sono _syntactically_ different. Sono _ematicamente_equivalenti. –

+0

E devo confessare che preferisco # 2, ma non perché rende esplicito il passaggio di un array; Lo preferisco perché rende esplicito che stai passando un ** indirizzo ** = P – WhozCraig

0

Il modo migliore per passare una matrice come parametro è in realtà:

void function(type_t* array, int amountOfElts, int arrayAllocatedElts);

In alcuni casi (come quando passano stringhe) spesso è possibile saltare questi due parametri. Ma possono essere utili in entrambi i casi, ad esempio quando si eseguono alcune operazioni sulla stringa, oppure possono salvarti una o due chiamate strlen.

L'utilizzo dell'opzione [] negli argomenti di funzione è a mio avviso confuso e dovrebbe essere evitato. Ma non penso sia una convenzione.

3

Se si desidera passare qualsiasi array (incluso l'allocazione dinamica), sono equivalenti.

caso la funzione richiede una matrice reale di dimensioni fisse, si potrebbe fare questo:

template <size_t N> 
void function(char (&str)[N]) { ... } 
1

Si chiede che scegliere di

void function(int arr[]) {...}; 

e

Quest'ultimo consente di dichiarare il puntatore stesso come const, mentre il primo consente solo di dichiarare gli articoli come const. Tuttavia, il lettore [] indica una matrice anziché un puntatore a un singolo oggetto. Personalmente ritengo che il vincolo offerto da const sia praticamente più utile dell'indicazione di matrice offerta da [].

Per il codice di livello superiore, utilizzare std::vector o std::array, a seconda di quale sia più appropriato.

0

A seconda del livello di astrazione che si desidera fornire, si dovrebbe scegliere tra Olaf di approccio o qualcosa STL utilizza per il grande livello:

template <class Iter> 
void function(Iter first, Iter last) 
{ 
    // for example, to get size: 
    std::size_t size = std::distance(first, last); 
    // for example, to iterate: 
    for (Iter it = first; it != last; ++it) 
    { 
     // *it to get the value, like: 
     std::cout << *it << std::endl; 
    } 
} 

questo modo, è possibile utilizzare la funzione non solo per gli array, ma per vari tipi di STL: vettori, elenchi, code, pile e così via.

int tab[4] = {1,2,3,4}; 
function(tab, tab+4); 

std::vector<int> vec; 
// fill vector with something 
function(vec.begin(), vec.end()); 
Problemi correlati