我有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;
我知道这是错的,我只想知道是否可以通过一个阵列访问它们?
答案 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;
}