我需要有效地分配一个二维数组,一个是已知的(5),另一个是未知的。
我的目标是要有一个名为block的连续内存块,该内存块通过以下方式存储我的数据: 块[0,0]块[0,1]块[0,2]块[0,3]块[0,4]块[1,0] ...]
以下代码编译(在C ++中):
unsigned int size2=200;
auto block = new float[size2][5];
对吗? 可变块的类型是什么? 我已经尝试过了:
float[5]* block = new float[size2][5];
float[5] block[] = new float[size2][5];
float block[][5] = new float[size2][5];
float block*[5] = new float[size2][5];
所有这些均导致错误。 我的想象力不足了...
答案 0 :(得分:3)
unsigned int size2=200;
auto block = new float[size2][5];
对吗?
是的。
可变块的类型是什么?
在这里最好使用auto
。但是出于学习目的,block
的类型为float(*)[5]
。要定义该类型的变量,必须使用以下语法:
unsigned int size2=200;
float(*block)[5] = new float[size2][5];
演示:https://godbolt.org/z/4iJMA5
“您怎么可能会问float(*block)[5]
这样的东西?” 。很简单,使用C++ Guru Snail Rule。
答案 1 :(得分:2)
unsigned int size2=200; auto block = new float[size2][5];
对吗?
是的,尽管仅拥有一个指针不是一个好主意。最好将std::vector
用于动态数组。
可变块的类型是什么?
它是float (*)[5]
,即指向5个浮点数的数组的指针。
正如我提到的,我建议使用std::vector
来避免内存管理的陷阱:
std::vector<std::array<float, 5>> block(size2);
答案 2 :(得分:1)
我有点老,但是最简单的是
new float[size2 * 5];
并使用
进行访问my_array[y * 5 + x]
您甚至可以添加内联帮助器功能
int at(int x, int y) { return y * 5 + x;}
...
my_array[at(x,y)]
并且最好与std :: vector而不是动态数组组合。