C 将1D动态数组施放到2D数组以使用常规索引(例如ARR [i] [J])



我的老师向我展示了将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数组的指针。usingtypedef相似,如果您使用了任何旧版本的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(。

希望这会有所帮助!

最新更新