在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是我们为每个条目设置的初始值,但您可以将其设置为任何您想要的值。