我的老师向我展示了将1D动态阵列铸成2D数组的方式
使用精美的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
,不是这样吗?我还搜索了谷歌搜索,找不到任何类似的解决方案。这样做不好吗?为什么没有人这样做?
在您的第一行,
使用myarr = int(*([mat_size] [mat_size];
您只是声明一种类型:myarr
是一种自定义类型,代表指向int
值2D数组的指针。using
与typedef
相似,如果您使用了任何旧版本的C 。
然后,
int * data = new int [mat_size * mat_size];
声明一个1维指针。在内存中,这是一系列值。
接下来,
Myarr arr =(Myarr(数据;
创建一个类型myarr
的新变量 - 也是一个简单的指针 - 并将其指向原始数组指针的地址。与该指针的区别在于,当第一次删除它时,它是数组类型。因此,它的第一个解除后其解释语法是不同的:作为二维数组,您使用两对括号。
请注意,因此,本质上,第二个数组变量仍然在内存中访问1维数组。在您拥有的第一个参考语句中/p>
(*arr([i] [j]
要正确地索引数组,C 编译了括号语法,以便它会自动将第一个索引乘以单行中的项目数。这被定义为myarr
的一部分,并被宣布为mat_size
。然后,之后,它将自动添加第二个索引。
(p.s。也不要被*arr
部分混淆 - 额外的*
在那里,因为myarr arr
变量点 data
actible ,而不是对实际数据数组本身。(
然后,在您的第二个语句中,
数据[i * mat_size j]
您使用的是原始指针,该指针具有很好的括号删除语法,但仅作为一维数组将其作为一维数组。因此,您必须自己进行索引,将mat_size
乘以第一个索引(i
(,然后手动添加第二个索引(j
(。
希望这会有所帮助!