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.
Nguồn
2010-02-28 15:54:59
thông tin chi tiết thực sự! cảm ơn ! – lovespring
* 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
@ 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. –