二维数组,一个已知,另一个未知

时间:2018-11-14 16:15:51

标签: c++ arrays types

我需要有效地分配一个二维数组,一个是已知的(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];

所有这些均导致错误。 我的想象力不足了...

3 个答案:

答案 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而不是动态数组组合。