Mảng hai chiều không phân rã thành con trỏ thành con trỏ thành int. Nó phân rã thành một con trỏ tới các mảng ints - tức là chỉ có chiều thứ nhất phân rã thành một con trỏ. Con trỏ không trỏ đến con trỏ int, mà khi tăng lên trước bởi kích thước của một con trỏ, nhưng để mảng của 5 số nguyên.
class Myclass {
private:
int myarray[5][5];
public:
typedef int (*pointer_to_arrays)[5]; //typedefs can make things more readable with such awkward types
pointer_to_arrays get_array() {return myarray;}
};
int main()
{
Myclass o;
int (*a)[5] = o.get_array();
//or
Myclass::pointer_to_arrays b = o.get_array();
}
Một con trỏ đến con trỏ (int**
) được sử dụng khi mỗi mảng con được phân bổ riêng biệt (có nghĩa là, bạn ban đầu có một mảng các con trỏ)
int* p[5];
for (int i = 0; i != 5; ++i) {
p[i] = new int[5];
}
Ở đây chúng ta có một mảng trong số năm con trỏ, mỗi trỏ đến mục đầu tiên trong một khối bộ nhớ riêng biệt, hoàn toàn 6 khối bộ nhớ riêng biệt.
Trong một mảng hai chiều bạn sẽ có được một khối liền kề duy nhất của bộ nhớ:
int arr[5][5]; //a single block of 5 * 5 * sizeof(int) bytes
Bạn sẽ thấy rằng việc bố trí bộ nhớ của những điều này là hoàn toàn khác nhau, và do đó những điều này không thể được trả lại và vượt qua cùng một cách.
lưới là gì? không phải là 'myarray'? – woodstok
Trả lại tài liệu tham khảo trực tiếp cho thành viên riêng tư có thể không phải lúc nào cũng là ý tưởng hay - bạn có thể đóng gói hiệu quả bằng cách này, cho phép mọi người truy cập và sửa đổi thành viên riêng tư của bạn. Điều này có thể hoặc có thể không được chấp nhận trong thiết kế của bạn. –
@MIkhail: Vì justin chưa trực tuyến kể từ phút anh ấy đăng câu hỏi này, tôi đã tự do sửa nó. – sbi