首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++对三维阵列的线性访问

C++对三维阵列的线性访问
EN

Stack Overflow用户
提问于 2022-01-09 08:20:40
回答 2查看 216关注 0票数 1

据我所知,当我分配三维数组时,我确实得到了线性内存,它只是通过定义步长来解释为三维的。

所以我想使用线性索引来访问三维数组,但是如何使用线性索引来获得第一个元素--例如,假设int32,为了得到第11个元素,我应该从数组开始移动320位,然后将这些位解释为int --似乎比从线性索引中计算3d指标要好得多,因为它需要多个除法.

下面我试着去做,但我还是做错了,因为我在这里,只要我得到解除第二数组的第0元素,而不是我想要的。

C++代码

代码语言:javascript
复制
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;

输出

代码语言:javascript
复制
2
10
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-01-09 10:29:29

**intsss[1]**(intsss[1])是一样的。如果您想以不同的方式表示intsss[0][0][1],请使用(**intsss)[1] (但在我看来,这是没有意义的)。

要以线性方式处理多维数组,首先要获得指向第一个元素的指针:&intsss[0][0][0]。然后像普通指针一样使用它:

代码语言:javascript
复制
int* p = &intsss[0][0][0];
std::cout << p[1];

获得指向第一个元素的指针的其他几种等效方法是:intsss[0][0]**intsss。如果使用这些方法,您应该小心,确保您了解指针衰减的确切原理,并确保得到指向int的指针,而不是指向数组的指针。例如:intsss[0]是一个二维数组,它衰变到指向3个ints数组的指针.在这个指针上做算术,一次跳转3个ints -可能不是你想要的。

严格地说,这样的线性寻址是非法的(未定义的行为),如果你越过最里面的数组的末端。但在实践中,它是有效的。

票数 1
EN

Stack Overflow用户

发布于 2022-01-09 09:33:52

使用下面的代码来玩,直到你得到你想要的。

代码语言:javascript
复制
#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;
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70639548

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档