C++ 线性访问 3 维数组
C++ linear access to 3 dimensional array
你好,据我所知,当我分配 3 维数组时,我真正获得了线性内存,它通过定义步幅被解释为 3 维。
所以我想使用线性索引访问 3 维数组,但是如何使用线性索引获取第一个元素 - 原则上应该是可能的,例如给定 int32 以获得第 11 个元素我应该移动 320 位从 beginin 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
使用下面的代码来尝试直到你得到你想要的。
#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;
}
**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 个整数数组的指针。对这个指针进行算术一次跳转 3 个整数——可能不是你想要的。
严格来说,如果你越过最内层数组的末尾,这种线性寻址是非法的(未定义的行为)。但在实践中,它是有效的。
你好,据我所知,当我分配 3 维数组时,我真正获得了线性内存,它通过定义步幅被解释为 3 维。
所以我想使用线性索引访问 3 维数组,但是如何使用线性索引获取第一个元素 - 原则上应该是可能的,例如给定 int32 以获得第 11 个元素我应该移动 320 位从 beginin 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
使用下面的代码来尝试直到你得到你想要的。
#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;
}
**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 个整数数组的指针。对这个指针进行算术一次跳转 3 个整数——可能不是你想要的。
严格来说,如果你越过最内层数组的末尾,这种线性寻址是非法的(未定义的行为)。但在实践中,它是有效的。