2010-02-28 21 views

Trả lời

27

Chuẩn C++ xác định mảng là gì và hành vi của nó. Hãy nhìn vào chỉ mục. Nó không phải là một con trỏ, const hoặc cách khác, và nó không phải bất cứ điều gì khác, đó là một mảng.

Để thấy sự khác biệt:

int a[10]; 
int *const b = a; 

std::cout << sizeof(a); // prints "40" on my machine. 
std::cout << sizeof(b); // prints "4" on my machine. 

Rõ ràng a và b không cùng loại, vì chúng có kích cỡ khác nhau.

Trong hầu hết các ngữ cảnh, tên mảng "phân rã" thành con trỏ thành phần tử đầu tiên của chính nó. Bạn có thể coi đây là một chuyển đổi tự động. Kết quả là một rvalue, có nghĩa là nó chỉ là "chỉ" một giá trị con trỏ, và không thể được gán cho, tương tự như khi một tên hàm phân rã thành một con trỏ hàm. Không có nghĩa là "const" như vậy, nhưng nó không thể chuyển nhượng được.

Vì vậy, một mảng "là" một con trỏ giống như một hàm "là" một con trỏ hàm, hoặc một "dài" là một int. Đó là để nói, nó không phải là thực sự, nhưng bạn có thể sử dụng nó như là một trong hầu hết các bối cảnh nhờ vào việc chuyển đổi.

+0

thông tin chi tiết thực sự! cảm ơn ! – lovespring

+0

* a sẽ in giá trị của phần tử thứ nhất trong mảng và do đó phải trỏ đến địa chỉ bộ nhớ của phần tử thứ nhất trong mảng. Vậy tại sao toán tử sizeof cho kích thước của tất cả các phần tử của mảng a thay vì cho kích thước chỉ lưu trữ địa chỉ bộ nhớ của phần tử thứ nhất của mảng? – user1825567

+1

@ user1825567: vì biểu thức '* a' có chuyển đổi ẩn trong nó (được gọi là" phân rã "), từ kiểu mảng thành kiểu con trỏ. Bạn có thể nghĩ về nó như một cách viết tắt cho '* pointer_to_first_element_of (a)'. Sau đó nó sẽ khá rõ ràng tại sao 'sizeof (a)' không cần phải giống như 'sizeof (pointer_to_first_element_of (a))'. 'a' không phải là một con trỏ. Bất cứ ai nói với bạn nó hoặc là không hiểu C hoặc không tôn trọng bạn đủ để nghĩ rằng bạn hiểu C. –

6

Tên mảng không phải là một con trỏ không đổi - tuy nhiên nó hoạt động giống như một trong nhiều ngữ cảnh (nó chuyển đổi thành một cảnh đẹp) cho hầu hết các mục đích.

Từ 6.3.2.1/3 "Khác toán hạng/lvalues, mảng, và định danh chức năng":

Trừ khi nó là toán hạng của sizeof nhà điều hành hoặc nhà điều hành & unary, hoặc là một chuỗi chữ đượ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ị.

+3

Tôi muốn lưu ý rằng đây là trích dẫn của Tiêu chuẩn C. Trong C++, mảng không bị phân rã bất kể. Nó đưa bối cảnh vào tài khoản, ví dụ: 'int a [10]; int (& r) [10] = a;/* không phân rã * /; '. –

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