Search

12. 다차원 배열

2차원 배열

배열의 요소가 정수로 이루어진 1차원 배열은 int arr[] = {1, 2, 3}; 으로 나타냅니다. 그리고 2차원 배열은 ‘배열의 배열’로, 아래의 코드와 같이 행과 열로 구성된 데이터 구조를 나타냅니다.
int arr[4][3] = { {1, 2, 3}, {10, 20, 30}, {100, 200, 300}, {1000, 2000, 3000}, };
C
복사
위 코드의 int arr[4][3] 을 설명하자면, int 는 배열의 각 요소가 정수형을 의미하고 arr은 배열의 이름, [4] 는 행의 크기(세로 길이), [3] 은 열의 크기(가로 길이)를 의미합니다.

배열의 크기

배열의 크기는 행의 크기 x 열의 크기 x 자료형 크기(int: 4byte) 입니다. 따라서, int arr[4][3] 의 크기는 48 입니다.(4 x 3 x 4)

배열의 주소

2차원 배열의 주소는 기본적으로 1차원 배열의 주소와 같은 방식으로 동작합니다. 배열의 이름은 배열의 첫 번째 요소([0][0])의 주소를 가리키며, 2차원 배열의 경우 n 번째 행의 주소는 n-1 번째 행의 마지막 요소의 주소 값에서 이어집니다. 쉽게 이해하기 위해 다음의 코드를 확인해주세요.
#include <stdio.h> int main(void) { printf("[*] 2차원 배열\n"); int arr[4][3] = { {1, 2, 3}, {10, 20, 30}, {100, 200, 300}, {1000, 2000, 3000} }; for(int i=0; i<4; i++){ for(int j=0; j<3; j++){ printf("arr[%d][%d](%p): %d\n", i, j, &arr[i][j], arr[i][j]); } } return 0; } /* arr[0][0](0x16d287018): 1 arr[0][1](0x16d28701c): 2 arr[0][2](0x16d287020): 3 arr[1][0](0x16d287024): 10 // [1][0]번째 행의 주소 = [0][2]의 주소 + 4(int 크기) arr[1][1](0x16d287028): 20 arr[1][2](0x16d28702c): 30 arr[2][0](0x16d287030): 100 // [2][0]번째 행의 주소 = [1][2]의 주소 + 4(int 크기) arr[2][1](0x16d287034): 200 arr[2][2](0x16d287038): 300 arr[3][0](0x16d28703c): 1000 // [3][0]번째 행의 주소 = [2][2]의 주소 + 4(int 크기) arr[3][1](0x16d287040): 2000 arr[3][2](0x16d287044): 3000 */
C
복사

선언 및 초기화

2차원 배열을 선언 및 초기화 시, 행과 열 위치에 값이 꼭 들어가야 합니다.
int arr1[3][3] = { {1, 2, 3}, {4, 5, 6}, {7, 8, 9} }; int arr2[3][3] = { // 아래 arr3과 동일 {1}, {4, 5}, {7, 8, 9} }; int arr3[3][3] = { // 위 arr2와 동일 {1, 0, 0}, {4, 5, 0}, {7, 8, 9} }; int arr4[3][3] = {1,2,3,4,5,6,7,8,9}; // arr1과 동일
C
복사

3차원 배열

3차원 배열은 아래와 같이 선언할 수 있습니다.
int arr[2][3][4] = { { {1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12} }, { {13, 14, 15, 16}, {17, 18, 19, 20}, {21, 22, 23, 24} } };
C
복사

배열의 크기

int arr[2][3][4]; 의 배열의 크기는 2 x 3 x 4 x 4(int 크기) 크기로 96입니다.

배열의 주소

3차원 배열의 주소도 1차원, 2차원 배열의 주소와 비슷한 방식으로 동작합니다. 배열의 이름은 배열의 첫 번째 요소([0][0][0])의 주소를 가리키며, 3차원 배열의 경우 n 번째 섹션의 주소는 n-1 번째 섹션의 마지막 요소의 주소 값에서 이어집니다.
#include <stdio.h> int main(void) { int arr2[2][3][4] = { { {1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12} }, { {13, 14, 15, 16}, {17, 18, 19, 20}, {21, 22, 23, 24} } }; for(int i=0; i<2; i++){ for(int j=0; j<3; j++){ for(int k=0; k<4; k++){ printf("arr2[%d][%d][%d](%p): %d\n", i, j, k, &arr2[i][j][k], arr2[i][j][k]); } } } return 0; } /* arr2[0][0][0](0x16b5aefa8): 1 arr2[0][0][1](0x16b5aefac): 2 arr2[0][0][2](0x16b5aefb0): 3 arr2[0][0][3](0x16b5aefb4): 4 arr2[0][1][0](0x16b5aefb8): 5 arr2[0][1][1](0x16b5aefbc): 6 arr2[0][1][2](0x16b5aefc0): 7 arr2[0][1][3](0x16b5aefc4): 8 arr2[0][2][0](0x16b5aefc8): 9 arr2[0][2][1](0x16b5aefcc): 10 arr2[0][2][2](0x16b5aefd0): 11 arr2[0][2][3](0x16b5aefd4): 12 arr2[1][0][0](0x16b5aefd8): 13 arr2[1][0][1](0x16b5aefdc): 14 arr2[1][0][2](0x16b5aefe0): 15 arr2[1][0][3](0x16b5aefe4): 16 arr2[1][1][0](0x16b5aefe8): 17 arr2[1][1][1](0x16b5aefec): 18 arr2[1][1][2](0x16b5aeff0): 19 arr2[1][1][3](0x16b5aeff4): 20 arr2[1][2][0](0x16b5aeff8): 21 arr2[1][2][1](0x16b5aeffc): 22 arr2[1][2][2](0x16b5af000): 23 arr2[1][2][3](0x16b5af004): 24 */
C
복사

예제 출력

$ gcc -o matrix_array.o matrix_array.c $ ./matrix_array.o [*] 2차원 배열 arr1[0][0](0x16f44f058): 1 arr1[0][1](0x16f44f05c): 2 arr1[0][2](0x16f44f060): 3 arr1[1][0](0x16f44f064): 10 arr1[1][1](0x16f44f068): 20 arr1[1][2](0x16f44f06c): 30 arr1[2][0](0x16f44f070): 100 arr1[2][1](0x16f44f074): 200 arr1[2][2](0x16f44f078): 300 arr1[3][0](0x16f44f07c): 1000 arr1[3][1](0x16f44f080): 2000 arr1[3][2](0x16f44f084): 3000 >> sizeof(arr1): 48 >> arr1 address: 0x16f44f058 >> arr1[0][0] address: 0x16f44f058 [*] 3차원 배열 arr2[0][0][0](0x16f44eff8): 1 arr2[0][0][1](0x16f44effc): 2 arr2[0][0][2](0x16f44f000): 3 arr2[0][0][3](0x16f44f004): 4 arr2[0][1][0](0x16f44f008): 5 arr2[0][1][1](0x16f44f00c): 6 arr2[0][1][2](0x16f44f010): 7 arr2[0][1][3](0x16f44f014): 8 arr2[0][2][0](0x16f44f018): 9 arr2[0][2][1](0x16f44f01c): 10 arr2[0][2][2](0x16f44f020): 11 arr2[0][2][3](0x16f44f024): 12 arr2[1][0][0](0x16f44f028): 13 arr2[1][0][1](0x16f44f02c): 14 arr2[1][0][2](0x16f44f030): 15 arr2[1][0][3](0x16f44f034): 16 arr2[1][1][0](0x16f44f038): 17 arr2[1][1][1](0x16f44f03c): 18 arr2[1][1][2](0x16f44f040): 19 arr2[1][1][3](0x16f44f044): 20 arr2[1][2][0](0x16f44f048): 21 arr2[1][2][1](0x16f44f04c): 22 arr2[1][2][2](0x16f44f050): 23 arr2[1][2][3](0x16f44f054): 24 >> sizeof(arr2): 96 >> arr2 address: 0x16f44eff8 >> arr2[0][0][0] address: 0x16f44eff8
Shell
복사