CH 16 다차원 배열
1. 다차원 배열의 이해와 활용
1. 다차원 배열을 대표하는 2차원 배열의 선언
int arr1[3][4]; -> 세로3, 가로 4인 int형 2차원 배열
int arr2[2][6]; -> 세로2, 가로 6인 int형 2차원 배열
<int arr1[3][4]의 형태>
[0][0] | [0][1] | [0][2] | [0][3] |
[1][0] | [1][1] | [1][2] | [1][3] |
[2][0] | [2][1] | [2][2] | [2][3] |
TYPE arr [세로길이][가로길이];
sizeof(arr1)의 결과 : 3*4*4 = 16
2. 2차원 배열의 메모리상 할당의 형태
우리가 사용하는 컴퓨터 메모리는 2차원 구조가 아니다. 이는 메모리 주소 값을 통해 알 수 있다. 우리가 사용하는 메모리의 주소 값은 다음과 같이 1차원적 구조이다.
" 0x1001번지, 0x1002번지, 0x1003번지, 0x1004번지 .... "
따라서 2차원 배열도 메모리상에는 1차원의 형태로 존재한다.
3. 2차원 배열 선언과 동시에 초기화하기
행 단위로 초기화할 값들을 별도의 중괄호로 명시해야한다. 일부 요소에 대해서는 초기화를 생략할 수 있는데, 비게 되는 공간은 0으로 초기화된다.
<2차원 배열 초기화1>
int arr[3][3] = {
{1,2,3},
{4,5,6},
{7,8,9}
};
1 | 2 | 3 |
4 | 5 | 6 |
7 | 8 | 9 |
<2차원 배열 초기화2>
int arr[3][3] = {
{1},
{4,5},
{7,8,9}
};
1 | 0 | 0 |
4 | 5 | 0 |
7 | 8 | 9 |
<2차원 배열의 초기화3>
int arr[3][3] = {
1,2,3
4,5,6
7
};
int arr[3][3] = {1,2,3,4,5,6,7};
int arr[3][3] = {1,2,3,4,5,6,7,0,0};
//위 세 결과는 모두 같다
위와 같이 리스트를 나열하면 1행의 1열부터해서 순서대로 초기화되는데, 부족한 영역은 0으로 초기화된다.
1 | 2 | 3 |
4 | 5 | 6 |
7 | 0 | 0 |
4. 배열의 크기를 알려주지 않고 초기화하기
1차원 배열 선언 시, 초기화 리스트가 존재한다면 배열의 길이를 명시하지 않아도 되었다. 2차원 배열도 마찬가지이다. 하지만 2차원 배열에서는 가로, 세로 길이 중 하나를 명시해야하는 제약 조건이 있다.
2. 3차원 배열
1. 3차원 배열의 논리적 구조
3차원 배열은 2차원 배열에서 높이의 개념이 추가되었다고 생각하면 된다.
int arr1[3][3][4]; → 높이3, 세로3, 가로4인 int형 3차원 배열
sizeof(arr1) : 3*3*4*4 = 144
3차원 배열의 가장 합리적인 표현은 "여러 개의 2차원 배열이 모여있는 형태"이다. 따라서 위의 arr1은 세로와 가로의 길이가 각각 3과 4인 int형 배열 3개가 겹쳐 있는 것으로 이해하는 것이 좋다.