ถ้าให้เดาก็คงบอกได้ว่าคุณมาจากพื้นหลัง Java นี่คือ C ++ และสิ่งต่างๆจะถูกส่งผ่านด้วยค่าเว้นแต่คุณจะระบุเป็นอย่างอื่นโดยใช้&
-operator (โปรดทราบว่าตัวดำเนินการนี้ยังใช้เป็นตัวดำเนินการ 'address-of' แต่ในบริบทที่แตกต่างกัน) ทั้งหมดนี้ได้รับการบันทึกไว้เป็นอย่างดี แต่ฉันจะทบทวนซ้ำ:
void foo(vector<int> bar);
void foo(vector<int> &bar);
void foo(vector<int> const &bar);
คุณยังสามารถเลือกที่จะส่งตัวชี้ไปยังเวกเตอร์ ( void foo(vector<int> *bar)
) แต่ถ้าคุณไม่ทราบว่าคุณกำลังทำอะไรอยู่และคุณรู้สึกว่านี่เป็นวิธีที่จะไปจริงๆอย่าทำ
นอกจากนี้เวกเตอร์ไม่เหมือนกับอาร์เรย์! ภายในเวกเตอร์จะติดตามอาร์เรย์ที่จัดการกับการจัดการหน่วยความจำให้คุณ แต่คอนเทนเนอร์ STL อื่น ๆ ก็เช่นกัน คุณไม่สามารถส่งผ่านเวกเตอร์ไปยังฟังก์ชันที่คาดว่าจะมีตัวชี้หรืออาร์เรย์หรือในทางกลับกัน (คุณสามารถเข้าถึง (ตัวชี้ไปที่) อาร์เรย์พื้นฐานและใช้สิ่งนี้ เวกเตอร์เป็นคลาสที่มีฟังก์ชันการทำงานมากมายผ่านฟังก์ชันสมาชิกในขณะที่ตัวชี้และอาร์เรย์เป็นประเภทที่มีอยู่แล้วภายใน นอกจากนี้เวกเตอร์ยังได้รับการจัดสรรแบบไดนามิก (ซึ่งหมายความว่าขนาดอาจถูกกำหนดและเปลี่ยนแปลงที่รันไทม์) ในขณะที่อาร์เรย์สไตล์ C จะถูกจัดสรรแบบคงที่ (ขนาดของมันคงที่และต้องทราบในเวลาคอมไพล์) ซึ่ง จำกัด การใช้งาน
ฉันขอแนะนำให้คุณอ่านเพิ่มเติมเกี่ยวกับ 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);
}