是否可以创建3d数组的指针数组?

时间:2014-05-14 17:30:24

标签: c++ c arrays pointers 3d

我有3个数组,A[5][3][5]B[5][4][5]C[5][2][5]。 是否可以通过指针数组访问它们,它们的第二个维度是不同的?类似的东西:

int A[5][3][5], B[5][4][5], C[5][2][5];
int ***D[3];
D[0] = A;
D[1] = B;
D[2] = C;

我知道这是错的,我只想知道是否可以通过一个阵列访问它们?

3 个答案:

答案 0 :(得分:2)

不,如果第二个维度不同,它将无效。你能做的最好就是这样:

struct arr {
    int *p; // pointer to first element
    int x, y, z; // array size
    int &at(int i, int j, int k) {
        return p[((i*y)+j)*z+k];
    }
}

或者您可以使用自己喜欢的多维数组库。 C ++缺少对多维数组的内置支持,除非在编译时已知除第一个大小以外的所有大小,并且C99 VLA在这种情况下不起作用。这是因为C / C ++使用数组的类型来确定每个维度的大小(第一个维度除外,可以是未指定的)。

答案 1 :(得分:0)

由于类型系统的限制,绝对不可能直接执行您想要的操作,但您可能需要考虑以下内容(使用C ++ 11语法):

#include <vector>
#include <array>
#include <iostream>

template <typename T, size_t x, size_t z>
struct Ragged : std::array<std::vector<std::array<T, z>>, x> {
  Ragged(size_t y) {
    for (auto &i : *this) {
      i.resize(y);
    }
  }
};

int main() {
  using R5y5 = Ragged<int, 5, 5>;

  R5y5 a(3), b(4), c(2);
  vector<R5y5> d{a, b, c};
  d[1][1][2][3] = 99; // checked at() calls supported for all dimensions, too

  for (auto const &d : D) {
    for (auto const &x : d) {
      std::cout << "[";
      for (auto const &y : x) {
        std::cout << "[";
        for (auto const &z : y) {
          std::cout << z << " ";
        }
        std::cout << "]";
      }
      std::cout << "]" << std::endl;
    }
    std::cout << std::endl;
  }
}

这可以让您对operator[]及其元素进行多维d访问,并允许您在y内放置任何d - 尺寸数组。请注意,三维伪阵列不再完全紧凑地存储,而是存储在可能增长的2-D切片中。

答案 2 :(得分:-1)

#include <stdio.h>

int main(){
    int A[5][3][5], B[5][4][5], C[5][2][5];
    void *D[3];
    D[0]=&A;
    D[1]=&B;
    D[2]=&C;
    B[1][2][3] = 99;
    printf("%d\n", (*(int(*)[5][4][5])D[1])[1][2][3]);//99

    return 0;
}