C언어

3차원 배열

ksge7 2020. 7. 13. 06:09

3차원 배열이란

2차원 배열에서 더 나아가 한 종류의 배열을 더 가진 배열이다.

 

1차원이 단순히 나열 즉 가로만 있었다면, 2차원은 가로 세로, 3차원은 가로, 세로, 높이까지 가지고 있다.

 

예를 들어 4각형을 기준으로 2차원 배열은 평면인 사각형이라면 3차원 배열은 3D로 된 사각형이다.

3차원 배열 만드는 법

3차원 배열은 자료형 + 배열 이름 + [높이][세로크기][가로크기]; 형식으로 만든다.

 

중괄호가 많이 쓰이기 때문에 주의해야 한다.

 

자료형 배열이름[높이][세로크기][가로크기] = { 
    {
        { 값, 값, 값 },
        { 값, 값, 값 }
    }, 
    {
        { 값, 값, 값 },
        { 값, 값, 값 }
    }
}

 

#include <stdio.h>

int main(void){
  int scores[2][3][5] = { //자료형 + 배열명 + [높이]+[세로길이]+[가로길이]
  {
  {99, 90, 95, 93, 91},
  {85, 89, 81, 83, 87},
  {72, 74, 76, 77, 78}
},
{
  {60, 64, 62, 67, 68},
  {52, 53, 57, 58, 56},
  {42, 44, 46, 47, 48}
  }
};

printf("%d\n", scores[0][1][2]); // 81출력.
printf("%d\n", scores[1][1][2]); // 57출력.
}

3차원 배열 요소에 값 저장하기

#include <stdio.h>

int main(void){
  int scores[2][3][5];
  
  scores[0][0][0] = 90;
  scores[0][0][1] = 90;
  scores[0][0][2] = 90;
  scores[0][0][3] = 90;
  scores[0][0][4] = 90;
  
  scores[0][1][0] = 90;
  scores[0][1][1] = 90;
  scores[0][1][2] = 90;
  scores[0][1][3] = 90;
  scores[0][1][4] = 90;
  
  scores[0][2][0] = 90;
  scores[0][2][1] = 90;
  scores[0][2][2] = 90;
  scores[0][2][3] = 90;
  scores[0][2][4] = 90;
  
  scores[1][0][0] = 90;
  scores[1][0][1] = 90;
  scores[1][0][2] = 90;
  scores[1][0][3] = 90;
  scores[1][0][4] = 90;
  
  scores[1][1][0] = 90;
  scores[1][1][1] = 90;
  scores[1][1][2] = 90;
  scores[1][1][3] = 90;
  scores[1][1][4] = 90;
  
  scores[1][2][0] = 90;
  scores[1][2][1] = 90;
  scores[1][2][2] = 90;
  scores[1][2][3] = 90;
  scores[1][2][4] = 90;
}

 

3차원 배열의 가로, 세로, 높이 구하기

#include <stdio.h>

int main(void){
  int scores[2][3][5] = {
  {
  {99, 90, 95, 93, 91},
  {85, 89, 81, 83, 87},
  {72, 74, 76, 77, 78}
},
{
  {60, 64, 62, 67, 68},
  {52, 53, 57, 58, 56},
  {42, 44, 46, 47, 48}
  }
};

int all = sizeof(scores); 
// 120출력: (4바이트*30개) 3차원 배열이 가진 공간의 크기 
int one = sizeof(scores) / sizeof(int); 
// 30출력: (120바이트/4바이트) 3차원 배열 내 요소들의 갯수
int heigh = sizeof(scores) / sizeof(scores[0]);  
// 2출력: (120바이트/60바이트) 면의 갯수, 3차원 배열의 크기 / 한 면의 크기
int row = sizeof(scores[0]) / sizeof(scores[0][0]); 
// 3출력: (60바이트 / 20바이트) 가로줄의 갯수, 한 면의 크기 / 한 줄의 크기
int column = sizeof(scores[0][0]) / sizeof(int); 
// 5출력: (20바이트 / 4) 세로줄의 갯수, 한 줄의 크기 / 요소 한개의 크기

printf("%d\n", all);
printf("%d\n", one);
printf("%d\n", heigh);
printf("%d\n", row);
printf("%d\n", column);
}

 

3차원 배열의 포인터

3차원 배열을 포인터에 할당할 경우 

 

"자료형 + (*포인터명)[세로줄의 크기][가로줄의 크기]"로 선언하면 된다.

 

#include <stdio.h>

int main(void){
  int scores[2][3][5] = {
  {
  {99, 90, 95, 93, 91},
  {85, 89, 81, 83, 87},
  {72, 74, 76, 77, 78}
},
{
  {60, 64, 62, 67, 68},
  {52, 53, 57, 58, 56},
  {42, 44, 46, 47, 48}
  }
};

int (*point)[3][5] = scores;
// 자료형 + (*포인트명)[세로길이]][가로길이]

printf("%p\n", point); //0x7ffc6c05f820 출력.
printf("%p\n", *point);//0x7ffc6c05f820 출력.
printf("%p\n", *scores);//0x7ffc6c05f820 출력.
printf("%p\n", &scores);//0x7ffc6c05f820 출력.
printf("%p\n", &point[0][0]);
//0x7ffc6c05f820 출력. 모든 주소값이 같은 것으로 볼 때 
//포인트된 초기값은 [0][0][0]에 맞춰져있다.
printf("%p\n", &scores[0][0][0]);
//0x7ffc6c05f820 출력. 모든 주소값이 같은 것으로 볼 때 
//포인트된 초기값은 [0][0][0]에 맞춰져있다.

printf("%d\n", point[0][0][0]); //99출력
printf("%d\n", point[0][1][2]); //81출력
printf("%d\n", point[1][1][2]); //57출력

printf("%d\n", scores[0][0][0]); //99출력
printf("%d\n", scores[0][1][2]); //81출력
printf("%d\n", scores[1][1][2]); //57출력
}