C++ 在C+中动态分配指向数组的指针+;

C++ 在C+中动态分配指向数组的指针+;,c++,arrays,pointers,malloc,C++,Arrays,Pointers,Malloc,我长期以来在C程序中使用指向数组的指针,其形式如下: int (*myarray)[2] = (int (*)[2]) malloc(n*sizeof(int[2])); P>但是,如何在C++中使用新的方法来实现呢?我能做这个吗 int (*myarray)[2] = (int (*)[2]) new int[n][2]; 编辑: 看来我原来的帖子是不完整和混乱的。下面是我编译和测试的代码片段,它看起来是正确的,但是我想从C++专家确认我使用的是一个合适的C++构造。 #include

我长期以来在C程序中使用指向数组的指针,其形式如下:

int (*myarray)[2] = (int (*)[2]) malloc(n*sizeof(int[2]));
<> P>但是,如何在C++中使用新的方法来实现呢?我能做这个吗

int (*myarray)[2] = (int (*)[2]) new int[n][2];
编辑:

看来我原来的帖子是不完整和混乱的。下面是我编译和测试的代码片段,它看起来是正确的,但是我想从C++专家确认我使用的是一个合适的C++构造。
#include <iostream>

int main() {

  int n=5;
  int (*A)[2] = new int[n][2];

  for (int i = 0; i < n; i++)
    for (int j = 0; j < 2; j++)
      A[i][j] = 2*i+j;

  for (int i = 0; i < n; i++)
    std::cout << A[i][0] << " " << A[i][1] << "\n";

  delete myarray;
#包括
int main(){
int n=5;
整数(*A)[2]=新整数[n][2];
对于(int i=0;istd::cout我认为实现您要求的最清晰的方法是对数组使用typedef:

typedef int array_t[2];
array_t* yourarray = new array_t[n];
但不要这样做,因为它需要进行手动内存管理,而且这往往会很乏味、容易出错和脆弱,特别是在异常安全方面。相反,请看一下
std::array
类模板(在C++11中是新的,但通过Boost可获得)在
std::vector
类模板中


为了澄清在容器中存储
std::vector
std::array
之间的区别,当涉及的元素数量较少且固定时,后者通常更为有效。原因是数组类不像vector那样动态分配东西。为此,vector需要三个指针(使用的存储的开始、结束和分配的存储的结束)当然还要加上数据本身的存储(加上可能由分配器引起的一些开销)所有这些都需要加载到CPU缓存中使用。考虑到LP64系统,这将需要32字节来存储8字节的数据,而仅仅使用8个字节,使用<代码> STD::数组< /代码>。< /P> < P>使用C++和STL的乐趣是获得一个提供数组行为的向量类。 这也使得管理和阅读更容易

std::vector< std::vector<int> > myarray(n);

我个人会写一个额外的代码行,如果它使代码更容易阅读。< /p>我能做到这一点吗?“什么?恐怕如果你使用上面的一个演员来编译一些东西,你就做了一些错误。作为C++初学者,忘记这些C型铸件存在的事实,几乎是零情况下,它确实是需要的。使用

int(*myarray)[2]=new int[n][2];
?您想要一个指针数组还是一个动态分配的指针?实际上,@πάνταῥεῖ, 编译器会说“是”,只要您记得在调用新int[n][2]之前将n设置为正整数即可。但我认为上面显示的myarray定义仍然是个坏主意。您需要
vector myarray(n,vector(2))
以创建两个整数的向量向量。但是,如上所述,使用
数组
代替。对于这种需要,向量向量不是太过了吗?固定数组的typedef以及声明和分配指向该类型的指针是澄清意图的好方法,同时保持数据结构的低开销。唯一的当然,如果你的代码是在C++ 11兼容编译器上编译的,那么我就把向量纯粹当作一个可移植的例子。如果你想要固定大小的数组,并且支持C++ 11,那么STD::AdS阵列就是答案。好了,再读一遍:对于旧的C++编译器,你只需在Boost中加入,使用<代码> Boo::数组< /代码>。
typedef int intarray[2];
intarray* ints = new intarray[n];
ints[0][0] = 1;
...
ints[n-1][1] = 6;