Gdybym miał zgadywać, powiedziałbym, że pochodzisz z języka Java. To jest C ++ i rzeczy są przekazywane przez wartość, chyba że określisz inaczej za pomocą &
-operator (zwróć uwagę, że ten operator jest również używany jako operator „address-of”, ale w innym kontekście). To wszystko jest dobrze udokumentowane, ale i tak powtórzę:
void foo(vector<int> bar);
void foo(vector<int> &bar);
void foo(vector<int> const &bar);
Możesz także zdecydować się na przekazanie wskaźnika do wektora ( void foo(vector<int> *bar)
), ale jeśli nie wiesz, co robisz i czujesz, że tak naprawdę jest do zrobienia, nie rób tego.
Poza tym wektory to nie to samo co tablice! Wewnętrznie wektor śledzi tablicę, w której zarządza pamięcią, ale tak samo postępuje wiele innych kontenerów STL. Nie możesz przekazać wektora do funkcji oczekującej wskaźnika lub tablicy lub odwrotnie (możesz uzyskać dostęp do (wskaźnika do) tablicy bazowej i użyć tego). Wektory to klasy oferujące wiele funkcji poprzez swoje funkcje składowe, podczas gdy wskaźniki i tablice są typami wbudowanymi. Ponadto wektory są przydzielane dynamicznie (co oznacza, że rozmiar można określić i zmienić w czasie wykonywania), podczas gdy tablice w stylu C są przydzielane statycznie (ich rozmiar jest stały i musi być znany w czasie kompilacji), co ogranicza ich użycie.
Sugeruję, abyś przeczytał trochę więcej o C ++ w ogóle (szczególnie rozpad tablic ), a następnie rzucił okiem na następujący program, który ilustruje różnicę między tablicami a wskaźnikami:
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);
}