创建指针对象指针的正确方法?

时间:2009-08-30 08:18:27

标签: c++

创建指针对象指针的正确方法是什么?例如,

int **foo;
foo = new int[4][4];

然后编译器给我一个错误,说“无法从int(*)[4]转换为int **。

感谢。

2 个答案:

答案 0 :(得分:10)

int **foo = new int*[4];
for (int i = 0; i < 4; i++)
   foo[i] = new int[4];

<强>澄清:

在许多语言中,上面的代码称为锯齿状数组,它仅在“行”具有不同大小时才有用。 C ++对动态分配的矩形数组没有直接的语言支持,但是很容易自己编写它:

int *foo = new int[width * height];
foo[y * height + x] = value;

答案 1 :(得分:8)

使用原始new使用起来有点笨拙。另外,内部维度(最后4个)必须是编译时常量。完成使用后,您还必须记住删除该数组。

int (*foo)[4] = new int[4][4];
foo[2][3] = ...;
delete[] foo;

如果感觉太“语法脑de”,你可以使用typedef来美化它

typedef int inner_array[4];
inner_array *foo = new int[4][4];
foo[2][3] = ...;
delete[] foo;

这称为矩形二维数组,因为所有行(其中4个,可在运行时确定)具有相同的宽度(必须在编译时知道)。

或者,使用std::vector,您不再需要删除删除,并且还会处理原始指针的混乱:

std::vector<int> v(4 * 4);
v[index] = ...;

您可以根据需要在矢量中添加或删除整数。你也可以创建一个vector< vector<int> >,但我发现它使用起来不实用,因为你必须管理单独的行向量(可以有不同的长度),并且它们不会被视为“一个单元”。

您始终可以创建将二维坐标映射到一维索引的函数

inline int two_dim(int x, int y) {
  return y * 4 + x;
}

v[two_dim(2, 3)] = ...;

对于您事先知道其大小的简单二维数组,您根本不需要new,但

int x[4][4]; 
x[2][3] = ...;