用“new”创建静态数组或其他动态数组创建方式的C++提问标题

6

我知道在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::vector和std::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个回答

4

了解一下创建动态数组的常用技术。

如果你使用的是20年前编写的C++,那么这些方法可能仍然适用。但是现在,应该使用std::vector作为动态数组,使用std::array作为固定大小数组。

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

至于具体的答案,new T[size]总是返回T*,因此你无法使用T(*)[size]捕获由new[]返回的指针。


йӮЈе°ұж„Ҹе‘ізқҖж— жі•дёәиҝҷдёӘжһ„йҖ int (*p)[5] =еҲҶй…ҚеҶ…еӯҳпјҢеҜ№еҗ—пјҹ - Kostiantyn Ponomarenko
2
你可以使用C++中的强制类型转换(int(*)[5])new int[5],但请不要在实际代码中这样做。 - David Haim
我只是在玩弄它并尝试更深入地理解它。顺便问一下,为什么你说不要在真正的代码中这样做? - Kostiantyn Ponomarenko
因为我们只有在必须使用时才会使用C指针和C转换。我猜你并不真的需要用它们。 - David Haim
那是个好观点 =) 。非常感谢。我已经得到了我想要的东西。现在我会补充我的问题,因为我无法在这里放置一段代码块。 - Kostiantyn Ponomarenko

1
问题在于左右两侧具有不同的类型。
类型包括:
new int[5]

int*.

的类型是:

int (*p)[5]

int (*)[5].

编译器无法将一个变量赋值给另一个变量。

一般来说,将T*赋值给T (*)[N]是不可能的。这就是为什么您需要使用在问题开头提到的语法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接