2014-05-14 2 views
1

배열이 3 개 있는데, A[5][3][5], B[5][4][5], C[5][2][5]입니다. 두 번째 차원이 다른 포인터 배열을 통해 액세스 할 수 있습니까? 다음과 같은 것 :3D 배열의 포인터 배열을 만들 수 있습니까?

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

다른 유형의 집합이 아닌 한 유형의 배열 만 만들 수 있습니다. – Deduplicator

+0

@Deduplicator : 여기서 중요한 통찰력은 C 및 C++에서 배열의 크기가 그 유형의 일부라는 것입니다. –

+0

void * 및 캐스팅 배열을 사용하기 전에 저장합니다. – BLUEPIXY

답변

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++에서는 배열의 유형을 사용하여 각 차원에서의 크기가 얼마나 큰 지 파악합니다 (첫 번째 차원은 지정되지 않을 수 있음).

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 안에 넣을 수 있습니다. 3 차원 의사 어레이는 더 이상 완전히 컴팩트하게 저장되지 않지만 잠재적으로 성장할 수있는 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; 
} 
관련 문제