据我所知,当我分配三维数组时,我确实得到了线性内存,它只是通过定义步长来解释为三维的。
所以我想使用线性索引来访问三维数组,但是如何使用线性索引来获得第一个元素--例如,假设int32,为了得到第11个元素,我应该从数组开始移动320位,然后将这些位解释为int --似乎比从线性索引中计算3d指标要好得多,因为它需要多个除法.
下面我试着去做,但我还是做错了,因为我在这里,只要我得到解除第二数组的第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发布于 2022-01-09 10:29:29
**intsss[1]和**(intsss[1])是一样的。如果您想以不同的方式表示intsss[0][0][1],请使用(**intsss)[1] (但在我看来,这是没有意义的)。
要以线性方式处理多维数组,首先要获得指向第一个元素的指针:&intsss[0][0][0]。然后像普通指针一样使用它:
int* p = &intsss[0][0][0];
std::cout << p[1];获得指向第一个元素的指针的其他几种等效方法是:intsss[0][0]或**intsss。如果使用这些方法,您应该小心,确保您了解指针衰减的确切原理,并确保得到指向int的指针,而不是指向数组的指针。例如:intsss[0]是一个二维数组,它衰变到指向3个ints数组的指针.在这个指针上做算术,一次跳转3个ints -可能不是你想要的。
严格地说,这样的线性寻址是非法的(未定义的行为),如果你越过最里面的数组的末端。但在实践中,它是有效的。
发布于 2022-01-09 09:33:52
使用下面的代码来玩,直到你得到你想要的。
#include <iostream>
#include <sstream>
#include <string>
void PRINT(const std::string &s) { std::cout << s; std::cout.flush(); }
template<typename...T> void say(T...t) { std::string s{}; std::stringstream ss(""); (ss<<...<<t); s=ss.str(); PRINT(s); }
int main()
{
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} } };
int a, b, c;
say("\n-----------\n");
a=intsss[2][2][0];
b=intsss[2][2][1];
c=intsss[2][2][2];
say("330 -> ", a, "\n331 -> ", b, "\n332 -> ", c, "\n");
say("\n-----------\n");
a=**intsss[0];
b=**intsss[1];
c=**intsss[2];
say("**0 -> ", a, "\n**1 -> ", b, "\n**2 -> ", c, "\n");
return 0;
}https://stackoverflow.com/questions/70639548
复制相似问题