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
복사