0

如何在不将 [][] 转换为 ** 的情况下分配给多维数组?我有一个下面的例子。我发现如何使用 new 在 C++ 中声明二维数组?但这使用了int**then new int[][4]

#include<cassert>

int a[8][4];
int*b = &a[0][0];
int*c = &a[2][0];
int*d = &a[0][2];

int main() {
    //shows right side is closer
    assert(d-b==2);
    assert(c-b==8); 
    auto aa = new int[][4];
    //set the right side, but is a syntax error
    //aa[][0] = new int[8];
    //type error
    aa[0] = new int[8];
}
4

3 回答 3

1

您应该在与new int[][4]. 中必须有表达式[]。否则,编译器怎么知道要分配多少。(使用 VC++ 的一些快速检查,它错误地接受了这个表达式,表明它把它当作等价于new int[0][4],并分配 0 个字节。它不能用 g++ 编译。)

当然,您还会通过滥用 auto. 永远不要使用的一个原因auto是您不知道实际类型,auto这意味着您不必知道它(当然,除非您想使用该变量)。在这种情况下,您绝对不应该使用auto,因为类型有点特殊,并且您希望您的读者知道它:

int (*aa)[4] = new int[8][4];

一旦你看到这个,它应该很明显aa[0]具有 type int[4],并且你无法为它分配一个指针,因为它不是一个指针。

当然,在 C++ 中,你永远不会写出这样的东西。您将定义一个Matrix2D类并使用它。(它可能会使用 astd::vector<int>来获取内存,并从你给出的两个计算单个索引。当然,在内部,所以你不必考虑它。)事实上,从来没有一个案例使用数组new

于 2013-09-10T16:12:24.547 回答
1

尝试

int (*array)[4] = (int (*)[4])malloc(sizeof(int) * 8 * 4);

现在您最多可以访问

array[7][3];
于 2013-09-10T15:54:57.740 回答
0

编辑: https ://stackoverflow.com/a/18723991/598940表示a = new int[][8]实际上是不合法的。

根据您的评论,您是否在问为什么a = new int[][8]合法但a[][4]不合法?

int[]是一个表示与 type 相同的类型表达式int*。它的存在(我相信)允许更多描述性的类型声明(也许除其他外)

void foo(int* x);   // is x an array of ints? or just a pointer to a single one?
void foo(int[] x);  // ah, ok -- x is intended to represent an array of ints

a[]另一方面,值表达式没有意义。

于 2013-09-10T16:14:18.673 回答