在c++中创建多维数组,不允许int**



在c++中,当我执行以下操作时,

int* b = new int[5];

new int[5];返回一个我用b指向的int*

但是,在执行时,

int** c = new int[5][10];

我收到一个错误,cannot convert ‘int (*)[10]’ to ‘int**’ in initialization.

为什么这种语法不起作用,而在其他情况下,例如

int** matrix = new int* [5];
for(int i=0; i < d1; i++){
matrix[i] = new int[10];
}

在上面的例子中,matrix是一个指针,指向一个包含5个元素类型为int *的数组,因此int** c = new int[5][10];没有完成同样的事情吗?我正在创建c,指向类型为int *的5个元素的数组的指针,因此类型应该是int**?

我想我的问题很简单,为什么int** c = new int[5][10];扔给我一个cannot convert ‘int (*)[10]’ to ‘int**’ in initialization,但它在提供的其他示例中起作用?

我不知道为什么你认为int** c = new int[5][10];int** matrix = new int* [5];是相同的语法,因为它们绝对不是。

首先,你可以这样做:

typedef int row10_t[10];
row10_t* matrix = new int[5][10];

现在你可以使用

matrix[0][1] = 5;
matrix[3][5] = 4;

问题虽然,是你把这个标记为c++问题,但这完全是C编程。如果你打算像其他人警告的那样用c++来做这件事,你真的应该用c++的方式来做;有很多优点。你可以这样做:

std::vector<std::vector<int>> matrix(5,std::vector<int>(10,3));
matrix[1][0] = 5;

你需要用任何你需要的方式初始化向量。也许不是这样,也许完全是这样,但这取决于你。在vector中,必须先设置值才能访问它们,因为vector需要为数据分配适当的空间。

你甚至可以在上面使用指针,因为向量使用连续内存分配,但是,这是c++。迭代vector的正确方法是使用迭代器,而不是指针。下面是一个使用基于范围的循环来提高可读性的例子:

for(auto& row : matrix)
{
for(auto& col : row)
{
std::cout << col << " ";
}
std::cout << std::endl;
}

它将输出包含我们改变的矩阵:

3 3 3 3 3 3 3 3 3 3 
5 3 3 3 3 3 3 3 3 3 
3 3 3 3 3 3 3 3 3 3 
3 3 3 3 3 3 3 3 3 3 
3 3 3 3 3 3 3 3 3 3 

3是我们为每个条目设置的初始值,但您可以将其设置为任何您想要的值。