【发布时间】:2022-01-09 08:20:40
【问题描述】:
您好,据我了解,当我分配 3 维数组时,我真正获得了线性内存,通过定义步幅仅将其解释为 3 维。
所以我想使用线性索引访问 3 维数组,但是如何使用线性索引获取第一个元素 - 原则上应该可以,例如给定 int32 为了获得第 11 个元素,我应该从 beginin 移动 320 位f 数组取下一个 32 并将这些位解释为 int - 似乎比从线性索引计算 3 d 索引的性能要高得多,因为它需要多次除法......
在下面我尝试了取消引用,但我仍然做错了,因为我在这里得到取消引用到第二个数组的第 0 个元素,而不是我想要的
C++ 代码
int intsss[3][3][3] = {
{ {1,2, 3}, {4, 5, 6}, {7,8, 9} },
{ {10,11, 12}, {13, 14, 15}, {16,17, 18} },
{ {19,20, 21}, {22, 23, 24}, {25,26, 27} }
};
std::cout << intsss[0][0][1] << std::endl;
std::cout << **intsss[1] << std::endl;
输出
2
10
【问题讨论】:
-
intsss[0]是一个数组,数组衰减为指针。您正在查看地址。 -
好的,我明白了!那么如何使用线性索引获取第一个元素!
-
只需取消引用指针
*intsss[0] -
谢谢,我更新了问题,您究竟如何考虑取消对这个特定 3d 案例的引用?如上所示,我仍然在做错事
-
*intsss[0] + index_1D,但我认为这是丑陋的 AF,如果您遍历最内层数组的大小,从技术上讲是未定义行为 (UB)。您还可以使用union在与 3D 数组相同的空间中键入(也 UB)一个 1D 数组,或使用reinterpret_cast告诉编译器使用intsss作为指向int的指针(仍然是UB)。我强烈建议对 3D 数组进行一些分析索引,以查看优化器完成代码后是否真的有问题。