Các mảng được chuyển theo mặc định bởi ref hay value? Cảm ơn.Các mảng được truyền như thế nào?
Trả lời
Chúng được chuyển thành con trỏ. Điều này có nghĩa là tất cả thông tin về kích thước mảng bị mất. Bạn sẽ tốt hơn nhiều nên sử dụng std :: vectơ, có thể được chuyển qua giá trị hoặc tham chiếu, khi bạn chọn, và do đó giữ lại tất cả thông tin của chúng.
Dưới đây là ví dụ về truyền mảng tới hàm. Lưu ý chúng ta phải xác định số lượng các phần tử cụ thể, vì sizeof (p) sẽ cho biết kích thước của con trỏ.
int add(int * p, int n) {
int total = 0;
for (int i = 0; i < n; i++) {
total += p[i];
}
return total;
}
int main() {
int a[] = { 1, 7, 42 };
int n = add(a, 3);
}
Mảng đặc biệt: chúng luôn được chuyển thành con trỏ đến phần tử đầu tiên của mảng.
Trước tiên, bạn không thể chuyển mảng theo giá trị theo nghĩa là bản sao của mảng được tạo. Nếu bạn cần chức năng đó, hãy sử dụng std::vector
hoặc boost::array
.
Thông thường, con trỏ đến phần tử đầu tiên được chuyển theo giá trị. Kích thước của mảng bị mất trong quá trình này và phải được truyền riêng. Chữ ký sau đây đều là tương đương:
void by_pointer(int *p, int size);
void by_pointer(int p[], int size);
void by_pointer(int p[7], int size); // the 7 is ignored in this context!
Nếu bạn muốn vượt qua bằng cách tham khảo, kích thước là một phần của các loại:
void by_reference(int (&a)[7]); // only arrays of size 7 can be passed here!
Thông thường bạn kết hợp vượt qua bằng cách tham khảo với các mẫu, vì vậy bạn có thể sử dụng chức năng với các kích thước được biết đến tĩnh khác nhau:
template<size_t size>
void by_reference(int (&a)[size]);
Hy vọng điều này sẽ hữu ích.
- 1. Các mảng yếu được sử dụng như thế nào?
- 2. Các mảng được triển khai trong Perl như thế nào?
- 3. Các mảng được triển khai trong java như thế nào?
- 4. Các đối số chức năng được truyền trong C như thế nào?
- 5. Các cấu trúc lớn có thể được truyền bằng giá trị hiệu quả như thế nào?
- 6. Mảng Javascript được so sánh như thế nào?
- 7. Các từ SYNC được chọn như thế nào?
- 8. Làm thế nào để truyền một mảng động được phân bổ 2D đến một hàm?
- 9. Các chức năng được sửa đổi như thế nào tại thời gian chạy sau đó được truyền cho nhiều luồng?
- 10. Truyền mảng như tham số hàm trong Lua?
- 11. Mảng rspec nên bao gồm như thế nào? một mảng
- 12. Mảng chỉ mục MongoDB như thế nào?
- 13. Làm thế nào để có được kết quả LINQ như mảng chuỗi?
- 14. Erlang truyền thông điệp giữa các tiến trình trên cùng một nút như thế nào?
- 15. truyền các mảng vào các hàm trong tcl. Chỉ upvar?
- 16. Truyền một mảng bằng COM?
- 17. GCC có tạo typedefs cho các mảng được truyền cho các hàm không?
- 18. Render mảng được truyền từ Express với Jade
- 19. Có cách nào để có được một mảng các đối số được truyền cho một phương thức không?
- 20. Các luồng IIS7 được gán như thế nào?
- 21. Các ngắt được xử lý như thế nào trên SMP?
- 22. Các chuỗi C++ được lưu trữ như thế nào?
- 23. Các khối try/catch được triển khai như thế nào?
- 24. Các tham chiếu yếu được triển khai như thế nào?
- 25. Các mutex được triển khai như thế nào?
- 26. Kích thước mảng hoạt động như thế nào trong Javascript
- 27. Tôi nên khởi tạo tăng :: mảng như thế nào?
- 28. Có cách nào để truyền các phương thức như các khối không?
- 29. Truyền mảng từ MVC sang javascript?
- 30. Tạo một mảng trong khi truyền nó như một đối số trong Java
Cảm ơn Neil, nhưng như tôi đã đề cập trong một bài đăng ngày hôm qua của tôi, tôi hiện đang làm việc trên excersizes từ TC + + PL và tôi phải sử dụng mảng oridinary. Tôi đã tự hỏi nếu nó là cần thiết để viết một cái gì đó như: void f (int (& a) [size]); hoặc là nó chỉ đủ để khai báo như là một mảng mà không cần ref. –
Vì vậy, cơ bản đánh giá bằng câu trả lời này họ thông qua bởi giá trị đó là kích thước của một con trỏ. Tôi có đúng không? –
@tất cả lý do chính đáng để không học C++ từ TC++ PL, IMHO. –