我的老师向我展示了将一维动态数组投射到二维阵列的方法 使用花哨的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
,那不是吗?我也用谷歌搜索,无法找到任何类似的解决方案。这样做是不是很糟糕?为什么没有人这样做?
答案 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
)。
希望这有帮助!