Nếu tôi phải đoán, tôi muốn nói rằng bạn đến từ nền tảng Java. Đây là C ++ và mọi thứ được truyền theo giá trị trừ khi bạn chỉ định khác bằng cách sử dụng &
-operator (lưu ý rằng toán tử này cũng được sử dụng làm toán tử 'address-of', nhưng trong một ngữ cảnh khác). Tất cả điều này đều được ghi lại đầy đủ, nhưng tôi vẫn sẽ lặp lại:
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
Bạn cũng có thể chọn chuyển một con trỏ đến một vector ( void foo(vector<int> *bar)
), nhưng trừ khi bạn biết mình đang làm gì và bạn cảm thấy rằng đây thực sự là cách để đi, đừng làm điều này.
Ngoài ra, vectơ không giống như mảng! Bên trong, vector theo dõi một mảng mà nó xử lý việc quản lý bộ nhớ cho bạn, nhưng nhiều vùng chứa STL khác cũng vậy. Bạn không thể truyền một vectơ cho một hàm khi mong đợi một con trỏ hoặc mảng hoặc ngược lại (bạn có thể truy cập vào (con trỏ tới) mảng bên dưới và sử dụng điều này). Vectơ là các lớp cung cấp nhiều chức năng thông qua các hàm thành viên của nó, trong khi con trỏ và mảng là các kiểu tích hợp sẵn. Ngoài ra, các vectơ được cấp phát động (có nghĩa là kích thước có thể được xác định và thay đổi trong thời gian chạy) trong khi các mảng kiểu C được cấp phát tĩnh (kích thước của nó là không đổi và phải được biết tại thời điểm biên dịch), hạn chế việc sử dụng chúng.
Tôi khuyên bạn nên đọc thêm một số điều về C ++ nói chung (cụ thể là phân rã mảng ), và sau đó xem chương trình sau đây minh họa sự khác biệt giữa mảng và con trỏ:
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);
}