Si tuviera que adivinar, diría que tiene experiencia en Java. Esto es C ++, y las cosas se pasan por valor a menos que especifique lo contrario usando el &
-operador (tenga en cuenta que este operador también se usa como el operador 'dirección de', pero en un contexto diferente). Todo esto está bien documentado, pero repetiré de todos modos:
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
También puede optar por pasar un puntero a un vector ( void foo(vector<int> *bar)
), pero a menos que sepa lo que está haciendo y sienta que este es realmente el camino a seguir, no lo haga.
Además, los vectores no son lo mismo que las matrices. Internamente, el vector realiza un seguimiento de una matriz de la que gestiona la memoria por usted, pero también lo hacen muchos otros contenedores STL. No puede pasar un vector a una función que espera un puntero o matriz o viceversa (puede obtener acceso (puntero a) la matriz subyacente y usar esto). Los vectores son clases que ofrecen mucha funcionalidad a través de sus funciones miembro, mientras que los punteros y las matrices son tipos integrados. Además, los vectores se asignan dinámicamente (lo que significa que el tamaño se puede determinar y cambiar en tiempo de ejecución) mientras que los arreglos de estilo C se asignan estáticamente (su tamaño es constante y debe conocerse en tiempo de compilación), lo que limita su uso.
Le sugiero que lea un poco más sobre C ++ en general (específicamente la desintegración de matrices ) y luego eche un vistazo al siguiente programa que ilustra la diferencia entre matrices y punteros:
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);
}