c ++使用" new"创建一个静态的数组。或者另一种创建动态数组的方法

时间:2016-10-30 14:36:22

标签: c++ arrays pointers new-operator

我知道在C ++中使用new创建动态数组的常用技巧是:

int * arr = new int[5];

一本书也说:

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

现在我想知道是否有办法使用new为数组分配内存,因此可以将其分配给指向整个数组的指针。 可能看起来像这样

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

以上示例不起作用。左边看起来对我来说正确。但我不知道右边应该是什么。

我的目的是了解它是否可行。我知道有std::vectorstd::array

更新

这是我真正想要检查的内容:

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;

以下是访问这些数组的方法:

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

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

2 个答案:

答案 0 :(得分:4)

  

知道创建动态数组的常用技术

在20年前编写的C ++中,也许。

现在,您应该将std::vector用于动态数组,将std::array用于固定大小的数组。

如果您的框架或平台提供了额外的数组类(如QT的QVector),它们也可以,只要您不直接使用C指针,并且您有基于RAII的数组类。

对于具体答案,new T[size]始终返回T*,因此您无法捕捉new[]T(*)[size]返回的指针。

答案 1 :(得分:1)

问题在于左右瞄准具有不同的类型。

类型:

new int[5]

int*.

类型:

int (*p)[5]

int (*)[5].

编译器不能将一个分配给另一个。

一般来说,无法将T*分配给T (*)[N]。这就是为什么你需要使用问题开头提到的语法。