2012-07-01 32 views
7

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?

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ó.

+3

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

+3

'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ỡ. –

Trả lời

15

Bởi vì tiêu chuẩn nói như vậy (tôi nhấn mạnh):

(C99, 6.3.2.1p3) "Trừ khi nó là toán hạng của toán tử sizeof hoặc & toán tử đơn hạng, hoặc là một string literal được sử dụng để khởi tạo một mảng, một biểu thức có kiểu "mảng kiểu" được chuyển thành một biểu thức có kiểu "con trỏ để nhập" trỏ đến phần tử ban đầu của đối tượng mảng và không phải là một giá trị. "

Lưu ý rằng đối với C++, tiêu chuẩn rõ ràng cho biết kích thước là kích thước của mảng:

(C++ 11, 5.3.3p2 sizeof) "[...] Khi áp dụng cho một mảng, kết quả là tổng số byte trong mảng. Điều này ngụ ý rằng kích thước của một mảng của các phần tử n gấp n lần kích thước của một phần tử. "

+0

Thankyou - điều này xóa nó hoàn toàn cho tôi. – mathematician1975

+0

Trong C++, quy tắc hơi khác một chút, nó có trường hợp khác mà sự phân rã không xảy ra: khi liên kết một biểu thức mảng với tham chiếu mảng. Nhưng đó là những điều kỳ quặc. Xem thêm http: // stackoverflow.com/questions/3368883/how-does-this-size-of-array-template-function-work – MSalters

6

sizeof là một toán tử, không phải là hàm. Đó cũng là một điều cụ thể ở đó. Các dấu ngoặc đơn thậm chí không cần thiết nếu đó là một biểu thức:

int a; 
sizeof (int); //needed because `int` is a type 
sizeof a; //optional because `a` is an expression 
sizeof (a); //^ also works 

Như bạn có thể thấy, nó cũng nằm trên biểu đồ này là precedence. Nó cũng là một trong những nhà khai thác không quá tải.

Các vấn đề liên quan