C ++将一维动态数组转换为二维数组以使用常用索引(如arr [i] [j])

时间:2018-02-23 19:35:34

标签: c++ arrays pointers memory

我的老师向我展示了将一维动态数组投射到二维阵列的方法 使用花哨的arr [i] [j]语法。

using myarr = int(*)[mat_size][mat_size];
int * data = new int[mat_size * mat_size];
myarr arr = (myarr)data;

现在可以使用

访问pos [i] [j]上的元素
(*arr)[i][j]

而不是

data[i * mat_size + j].

不幸的是,我不明白这个解决方案中发生了什么。有人可以解释一下吗?

P上。 S. 解决方案有效,但我不明白。 我不知道为什么myarr arr指向data变量,而不是指向内存中的实际数据。如果我们做myarr arr = (myarr)&data,那不是吗?我也用谷歌搜索,无法找到任何类似的解决方案。这样做是不是很糟糕?为什么没有人这样做?

1 个答案:

答案 0 :(得分:0)

在第一行,

using myarr = int(*)[mat_size][mat_size];

您只是声明一种类型:myarr是一种自定义类型,表示指向int值的二维数组的指针。如果您使用过任何旧版本的C ++,using类似于typedef

然后,

int* data = new int[mat_size * mat_size];

声明一维指针。在内存中,这是一系列的值。

接下来,

myarr arr = (myarr)data;

创建一个类型为myarr的新变量 - 也是一个简单的指针 - 并将其指向原始数组指针的地址。与这个指针的区别在于,当第一次解除引用时,它是一个数组类型;因此,第一次取消引用后它的解除引用语法是不同的:作为一个二维数组,你使用两对括号。

请注意,第二个数组变量实际上仍然访问内存中的1维数组在第一个引用语句中,< / p>

(*arr)[i][j]

为了正确地索引数组,C ++编译括号语法,以便它自动将第一个索引乘以单行中的项目数。这被定义为myarr的一部分,并被声明为mat_size。然后,在此之后,它会自动添加第二个索引。

(ps也不会被*arr部分混淆 - 额外*因为myarr arr变量指向data 变量< / em>,而不是实际的数据数组本身。)

然后,在你的第二个声明中,

data[i * mat_size + j]

你正在使用原始指针,它有一个很好的括号解除引用语法,但只能作为一维数组取消引用。因此,您必须自己编制索引,手动将mat_size乘以第一个索引(i),然后手动添加第二个索引(j)。

希望这有帮助!