2016-10-30 14 views
6

Tôi biết rằng các kỹ thuật phổ biến của việc tạo ra một mảng động sử dụng new trong C++ như sau:C++ tạo một tĩnh như mảng với "mới" hay một cách khác để tạo ra một mảng động

int * arr = new int[5]; 

Một cuốn sách cũng nói:

short tell[10]; // tell an array of 20 bytes 
cout << tell << endl; // displays &tell[0] 
cout << &tell << endl; // displays address of the whole array 
short (*p)[10] = &tell; // p points to an array of 20 shorts 

Bây giờ tôi tự hỏi, nếu có một cách để phân bổ bộ nhớ cho một mảng sử dụng new, vì vậy nó có thể được sau đó được gán cho một con trỏ đến toàn bộ mảng. Nó có thể trông giống như thế này:

int (*p)[5] = new int[5]; 

Ví dụ trên không hiệu quả. Phía bên trái có vẻ đúng với tôi. Nhưng tôi không biết những gì nên ở bên phải.

Ý định của tôi là hiểu nếu có thể. Và tôi biết rằng có std::vectorstd::array.

UPD

Dưới đây là những gì tôi thực sự muốn kiểm tra:

int (*p1)[5] = (int (*)[5]) new int[5]; 
// size of the whole array 
cout << "sizeof(*p1) = " << sizeof(*p1) << endl; 

int * p2 = new int[5]; 
// size of the first element 
cout << "sizeof(*p2) = " << sizeof(*p2) << endl; 

Và đây là làm thế nào để truy cập vào các mảng:

memset(*p1, 0, sizeof(*p1)); 
cout << "p1[0] = " << (*p1)[0] << endl; 

memset(p2, 0, sizeof(*p2) * 5); 
cout << "p2[0] = " << p2[0] << endl; 

Trả lời

4

biết rằng kỹ thuật phổ biến tạo mảng động

Trong C++ đã được viết cách đây 20 năm, có thể.

Những ngày này, bạn nên sử dụng std::vector cho mảng động và std::array cho mảng kích thước cố định.

Nếu khung hoặc nền tảng của bạn cung cấp các lớp mảng bổ sung (như QT QVector), chúng cũng tốt, miễn là bạn không gây rối với C-con trỏ trực tiếp và bạn có lớp mảng dựa trên RAII.

và để có câu trả lời cụ thể, new T[size] luôn trả về T*, vì vậy bạn không thể bắt được con trỏ trả về new[] với T(*)[size].

+0

Vì vậy, điều đó có nghĩa là không thể cấp phát bộ nhớ cho cấu trúc này 'int (* p) [5] ='. Đúng? –

+2

bạn có thể ép mạnh nó bằng c-cast '(int (*) [5]) int mới [5]', nhưng xin vui lòng, đừng làm điều đó trong mã thực. –

+0

Tôi chỉ chơi xung quanh nó và cố gắng để có được sự hiểu biết. BTW, tại sao bạn nói không làm điều đó trong mã thực? –

1

Vấn đề là các điểm tham quan bên trái và bên phải có các loại khác nhau.

Loại:

new int[5] 

được

int*. 

Loại:

int (*p)[5] 

int (*)[5]. 

Và trình biên dịch không thể gán cho người khác.

Nói chung không thể chỉ định T* đến T (*)[N]. Đó là lý do tại sao bạn cần phải sử dụng cú pháp được đề cập trong phần đầu của câu hỏi của bạn.

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