创建指针对象指针的正确方法是什么?例如,
int **foo;
foo = new int[4][4];
然后编译器给我一个错误,说“无法从int(*)[4]转换为int **。
感谢。
答案 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] = ...;