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 个整数——可能不是你想要的。

严格来说,如果你越过最内层数组的末尾,这种线性寻址是非法的(未定义的行为)。但在实践中,它是有效的。