Vì vậy, chúng ta hãy nói rằng tôi có một mảng:Khi một mảng-T đã phân rã thành một con trỏ tới T, nó có thể được tạo thành mảng-of-T một lần nữa không?
int a[3] = { 1, 2, 3 };
Bây giờ nếu tôi được kiểm tra các loại 'a', trên máy tính của tôi, tôi nhận được:
cout<<typeid(a).name(); // prints 'A3_i'
Bây giờ nếu tôi có địa chỉ của 'a', sau đó dereference địa chỉ đó, các loại không thay đổi (mà tôi thực sự thích, bởi vì trong tâm trí của tôi 'dùng địa chỉ' và 'dereferencing' là hoạt động ngược lại):
cout<<typeid(*&a).name(); // also prints 'A3_i'
Tuy nhiên nếu tôi derefere nce 'a' đầu tiên, sau đó lấy địa chỉ của điều đó, loại thay đổi (tôi thừa nhận rằng tôi không có thời gian khó thích, vì khi tôi đăng ký lại mảng, tôi sẽ nhận được int, và khi tôi lấy địa chỉ của rằng int, tôi sẽ nhận được một con trỏ-to-int, và nó quay ra tôi làm):
cout<<typeid(&*a).name(); // prints 'Pi'
Vì vậy, đây là hai câu hỏi của tôi:
1) Khi một mảng kiểu đã phân rã thành một kiểu con trỏ, là có anyway để có được nó trở lại một mảng-loại?
Tôi đã thử các chiến lược rõ ràng đúc giống như-bạn-chỉ-đừng-care:
cout<<typeid((int[3]) &*a).name(); // does not compile
// "error: ISO C++ forbids casting to an array type `int [3]'"
Có một dàn diễn viên đó sẽ làm việc? Hoặc đó là loại chuyển đổi nghiêm ngặt off-giới hạn?
2) Có hay không bạn có thể quay lại kiểu mảng, chính xác thông tin nào được cắt và bị mất trong quá trình chuyển đổi từ con trỏ sang con trỏ?
Tôi hiểu rằng kiểu con trỏ và loại mảng không tương đương. Tôi giả sử rằng kiểu mảng là một siêu dữ liệu nghiêm ngặt của thông tin được lưu trữ trong kiểu con trỏ. Điều này có đúng không?
Tôi đã đọc trong các câu hỏi khác rằng thông tin bổ sung trong loại mảng là: kiến thức về việc mảng có nằm trên ngăn xếp hay không và kích thước của nó (nó phải biết kích thước của mảng bằng cách nào đó, vì nó là một phần của loại, phải không?). Có bất kỳ thông tin nào khác bị ẩn trong mảng kiểu không?
Tôi sẽ quan sát rằng int [3] không phải là một loại, mặc dù int [] là. –
@Daniel: "Mảng 3 int" chắc chắn là khác biệt với "int []" và "int [3]" có vẻ như là viết tắt hợp lý cho trước đây. –
Bất kể bạn nói gì. –