I know that the common technique of creating a dynamic array using new
in C++ is:
int * arr = new int[5];
A book also says:
short tell[10]; // tell is 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
Now I wonder if there is a way to allocate memory for an array using new
, so it can be then assigned to a pointer to the whole array. It might look like this:
int (*p)[5] = new int[5];
The above example doesn't work. The left side looks correct to me. But I don't know what should be on the right.
My intention is to understand if it's possible. And I know that there are std::vector
and std::array
.
Update:
Here is what I actually wanted to check:
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;
And here is how to access these arrays:
memset(*p1, 0, sizeof(*p1));
cout << "p1[0] = " << (*p1)[0] << endl;
memset(p2, 0, sizeof(*p2) * 5);
cout << "p2[0] = " << p2[0] << endl;
know that the common technique of creating a dynamic array
In C++ that was written 20 years ago, maybe.
These days you should use std::vector
for dynamic arrays and std::array
for fixed size array.
If your framework or platform supplies additional array classes (like QT's QVector
), they are fine too, as long as you don't mess with C-pointers directly, and you have RAII-based array class.
and as for concrete answer, new T[size]
always returns T*
, so you cannot catch a pointer returned by new[]
with T(*)[size]
.