Якби мені довелося здогадуватися, я б сказав, що ви з походження Java. Це C ++, і речі передаються за значенням, якщо ви не вказали інше за допомогою &
-operator (зауважте, що цей оператор також використовується як оператор 'address-of', але в іншому контексті). Це все добре задокументовано, але я все одно повторю:
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
Ви також можете передати вказівник на вектор ( void foo(vector<int> *bar)
), але якщо ви не знаєте, що робите, і не відчуваєте, що це справді такий шлях, не робіть цього.
Крім того, вектори - це не те саме, що масиви! Внутрішньо вектор відстежує масив, з якого він обробляє управління пам’яттю для вас, але це робить і багато інших контейнерів STL. Ви не можете передати вектор функції, яка очікує вказівника або масиву, або навпаки (ви можете отримати доступ до (вказівника на) базовий масив і використовувати це, хоча). Вектори - це класи, що пропонують багато функціональних можливостей за допомогою своїх функцій-членів, тоді як покажчики та масиви - це вбудовані типи. Крім того, вектори динамічно розподіляються (це означає, що розмір може бути визначений і змінений під час виконання), тоді як масиви у стилі С статично розподіляються (його розмір є постійним і повинен бути відомий під час компіляції), обмежуючи їх використання.
Я пропоную вам прочитати трохи більше про C ++ загалом (зокрема про розпад масивів ), а потім поглянути на наступну програму, яка ілюструє різницю між масивами та покажчиками:
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);
}