tôi đọc một câu hỏi trước đó đã đóng cửa do trở thành một bản sao chính xác của việc nàyTại sao phân rã thành con trỏ cho đối số mảng xuất hiện không áp dụng cho sizeof()?
When a function has a specific-size array parameter, why is it replaced with a pointer?
và
How to find the 'sizeof' (a pointer pointing to an array)?
nhưng sau khi đọc bài viết này tôi vẫn còn nhầm lẫn bởi cách sizeof() công trinh. Tôi hiểu rằng việc chuyển một mảng làm đối số cho một hàm như
void foo(int a[5])
sẽ dẫn đến đối số mảng phân rã thành con trỏ. Những gì tôi đã không tìm thấy trong các câu hỏi trên 2 liên kết là một câu trả lời rõ ràng là tại sao nó là chính chức năng sizeof()
được miễn (hoặc ít nhất dường như được miễn) hành vi phân rã con trỏ này. Nếu sizeof() cư xử giống như bất kỳ chức năng khác sau đó
int a[5] = {1,2,3,4,5};
cout << sizeof(a) << endl;
sau đó ở trên nên sản lượng 4
thay vì 20
. Tôi đã bỏ lỡ một cái gì đó rõ ràng như điều này có vẻ là một mâu thuẫn của phân rã để hành vi con trỏ? Xin lỗi vì đã đưa nó lên một lần nữa nhưng tôi thực sự đang có một thời gian khó hiểu tại sao điều này xảy ra mặc dù đã vui vẻ sử dụng chức năng trong nhiều năm mà không thực sự nghĩ về nó.
Lưu ý: 'void foo (int (& a) [5])' sẽ * không * làm đối số mảng bị phân rã. Đó là mục tiêu quan trọng, không phải là nguồn. – Xeo
'void foo (int a [5])' - Tôi thực sự muốn mẫu tham số đó sẽ không được chấp nhận và chỉ cho phép biểu mẫu 'void foo (int * a) ', nó không gây ra sự nhầm lẫn nào. Tôi không quan tâm ai mã nó phá vỡ. –