Se dovessi indovinare, direi che provieni da un background Java. Questo è C ++, e le cose vengono passate per valore a meno che non specifichi diversamente usando l' &
operatore-(nota che questo operatore è usato anche come operatore 'indirizzo di', ma in un contesto diverso). È tutto ben documentato, ma lo ripeterò comunque:
void foo(vector<int> bar); // by value
void foo(vector<int> &bar); // by reference (non-const, so modifiable inside foo)
void foo(vector<int> const &bar); // by const-reference
Puoi anche scegliere di passare un puntatore a un vettore ( void foo(vector<int> *bar)
), ma a meno che tu non sappia cosa stai facendo e senti che questa è davvero la strada da percorrere, non farlo.
Inoltre, i vettori non sono gli stessi degli array! Internamente, il vettore tiene traccia di un array di cui gestisce la gestione della memoria per te, ma anche molti altri contenitori STL. Non puoi passare un vettore a una funzione che si aspetta un puntatore o un array o viceversa (puoi accedere a (puntatore a) l'array sottostante e usarlo però). I vettori sono classi che offrono molte funzionalità attraverso le sue funzioni membro, mentre i puntatori e gli array sono tipi incorporati. Inoltre, i vettori vengono allocati dinamicamente (il che significa che la dimensione può essere determinata e modificata in fase di esecuzione) mentre gli array in stile C sono allocati staticamente (la sua dimensione è costante e deve essere nota in fase di compilazione), limitandone l'uso.
Ti suggerisco di leggere un po 'di più sul C ++ in generale (in particolare il decadimento degli array ), e poi dare un'occhiata al seguente programma che illustra la differenza tra array e puntatori:
void foo1(int *arr) { cout << sizeof(arr) << '\n'; }
void foo2(int arr[]) { cout << sizeof(arr) << '\n'; }
void foo3(int arr[10]) { cout << sizeof(arr) << '\n'; }
void foo4(int (&arr)[10]) { cout << sizeof(arr) << '\n'; }
int main()
{
int arr[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
foo1(arr);
foo2(arr);
foo3(arr);
foo4(arr);
}