Tôi biết rằng khi tôi muốn truyền một mảng tới một hàm, nó sẽ phân hủy thành con trỏ, vì vậy kích thước của nó sẽ không được biết đến và hai tờ khai đây là tương đương:Tại sao kích thước của một mảng được truyền vào một hàm bằng tham chiếu được biết tới trình biên dịch trong C++?
void funtion(int *tab, int size);
và
void funtion(int tab[], int size);
Và tôi hiểu tại sao. Tuy nhiên, tôi đã kiểm tra rằng khi tôi vượt qua một mảng như một tài liệu tham khảo:
void funtion(int (&tab)[4]);
trình biên dịch sẽ biết kích thước của mảng và sẽ không cho phép tôi vượt qua một loạt các kích thước khác nhau như một cuộc tranh cãi của chức năng này.
Tại sao lại như vậy? Tôi biết rằng khi tôi chuyển một mảng theo địa chỉ, kích thước không được tính đến khi tính toán vị trí của phần tử ith trong mảng, do đó, nó bị hủy ngay cả khi tôi đưa nó vào khai báo hàm:
void funtion(int tab[4], int size);
Nhưng điều gì khác khi tôi chuyển mảng bằng tham chiếu? Tại sao kích thước của nó được biết đến với trình biên dịch?
Lưu ý: Tôi quan tâm đến các mảng có kích thước được biết tại thời gian biên dịch, vì vậy tôi không sử dụng bất kỳ mẫu nào.
tôi thấy a similar question trên Stack Overflow, tuy nhiên nó không trả lời câu hỏi của tôi - nó không giải thích lý do tại sao trình biên dịch biết kích thước của mảng, đó chỉ là một số thông tin về làm thế nào để vượt qua các mảng chức năng.
Cảm ơn :) Nó có thể là một câu hỏi ngu ngốc, nhưng tại sao mảng không được chuyển qua phân rã tham chiếu thành con trỏ? Và tại sao thêm một ngắt kiểm tra một số mã giả định nó hoạt động tốt ngay bây giờ? – user2738748
@ user2738748 Phân rã thành con trỏ là một di sản khủng khiếp của C. Không ai thích nó, nhưng thật khó để thay đổi nó trong C++, vì có một mong muốn nhất định làm cho càng nhiều mã C biên dịch với trình biên dịch C++ càng tốt. Nhưng vì không có tài liệu tham khảo trong C, C++ có thể đặt bất kỳ quy tắc nào liên quan đến chúng, không bị ràng buộc. Và các quy tắc lành mạnh đã được thiết lập. – SergeyA