책 정리/윤성우의 열혈 C

(Part 03 포인터와 배열의 완성) Chapter16 다차원배열.

190730 2019. 9. 27. 11:40

행과 열을 헷갈려하는 사람들이 있다. 그런 사람들은 이걸 생각하자!

"가로 행! 세로 열!"

 

'다차원 배열'은 2차원 이상의 배열을 의미한다. 다차원 배열은 1차원 배열의 연장선상에 놓여있다.

 

1차원 배열은 논리적으로 1차원의 형태를 띈다.

2차원 배열은 2차원의 형태 평면구조의 배열이고, 3차원 배열은 3차원의 형태 직육면체 구조의 배열이다.

C언어의 문법은 4차원 이상의 배열 선언을 문법적으로 허용하고 있으나 불필요하기도 하고 논리적으로 이해하기도 어려운 형태의 배열이라서 다차원 배열은 2차원 3차원 배열을 의미하는 것으로 이해하면 된다.

 

1차원 배열 선언: TYPE arr1[x(길이)];                  // 길이가 x인 1차원 TYPE형 배열

2차원 배열 선언: TYPE arr2[x(세로)][x(가로)];       //세로, 가로가 각각 x인 2차원 TYPE형 배열

3차원 배열 선언: TYPE arr3[x][x][x];                  // 가로, 세로, 높이의 길이가 각각 x인 3차원 TYPE형 배열

 

가장 많이 사용하는 배열은 1차원과 2차원이고 2차원 배열이 사실상 다차원 배열을 대표한다고 생각하면 된다.

2차원 배열을 본질적으로 이해하면 3차원 배열은 별도의 이해가 필요치 않다.

 

2차원 배열도 sizeof 함수를 사용할 경우 1차원 배열과 동일하게 배열의 크기가 반환된다.

int arr1[3][4];    ->    sizeof(arr1);    ->   48    ==   3 x 4 x 4

 

2차원 배열 요소의 접근도 1차원 배열과 마찬가지로 똑같이 접근하나 세로가 추가되었다고 보면 된다.

- arr[0][1] = 1;

 

이렇듯 이름이 arr인 int형 배열을 대상으로 세로 N번째 가로 M번째 위치에 저장된 값을 변경 및 참조하는 방법을 일반화하면 arr[N-1][M-1]=20; 과 같다.

 

2차원 배열의 입력이나 출력 같은 경우엔 for문을 중첩시키는 것이 일반적이고 또 가장 쉬운 방법이다.

모든 2차원 배열은 1차원 배열로 구현이 가능하나 그것은 프로그램을 복잡하게 만들 뿐이다.

 

2차원 배열의 메모리상 할당의 형태

메모리는 1차원적 구조이므로 2차원의 배열이라고 해도 물리적으로 2차원의 형태로 존재하지 않는다.

2차원 배열이 선언이 되면 메모리상에 arr[0][0] 부터 가로가 1씩 증가할때마다 자료형의 크기만큼 주소값이 증가한다.

int형 배열일 경우에:

arr[0][0] = 002AFD54번지   arr[0][1] = 002AFD58번지 ............

 

 

2차원 배열도 선언과 동시에 초기화가 가능하다.

 

        1                                  2                                                                    3

int arr[3][3] = {          |       int arr[3][3] = {                       |              int arr[3][3] = {1, 2, 3, 4, 5, 6, 7};

   {1, 2, 3},                |           {1},                                  |

   {4, 5, 6},                |           {2, 3},                               |

   {7, 8, 9}                 |           {4, 5, 6}                            |

};                            |           };                                    |

 

이런 형식으로 초기화가 가능하며 1차원 배열과 마찬가지로 부족한 영역은 0으로 초기화가 된다.

 

2차원 배열도 1차원 배열과 마찬가지로 초기화 리스트가 존재할 경우 배열의 길이를 명시하지 않아도 된다.

그러나 세로의 길이만 명시하지 않아도 되고 가로의 길이는 입력을 해줘야 컴파일러가 인식이 가능하다.

 

 

------------------------------------------------------------------------------------------------------------------------------

 

16.2 3차원 배열

 

3차원 배열은 흔히 사용되는 배열이 아닐뿐더러 2차원 배열을 이해하고 있다면, 3차원 배열도 이해한 것이다.

3차원 배열은 2차원 배열(세로, 가로,)에서 높이가 추가된 개념이다. 

3차원 배열은 여러 2차원 배열의 집합이고, 2차원 배열은 여러 1차원 배열의 집합이다.

 

선언 방법: int arr1[2][3][4];        // 높이2, 세로,3, 가로4 인 int형 3차원 배열

             double arr2[5][5][5]  // 높이, 세로, 가로가 각각 5인 double형 3차원 배열

 

int record[2][3][2] = {
   {
       {70, 80},
       {94, 90}, 
       {70, 85}
   },
   {
      {83, 90},

      {95, 60},
      {90, 82}
   }
};