다차원 배열
다차원 배열
2차원 이상의 배열을 의미하며, 배열의 요소로 또 다른 배열을 가지는 배열을 의미한다.
2차원 배열은 1차원 배열을 요소로 가지며 3차원 배열은 2차원을 배열로 가지는 형태이다.
1. 2차원 배열
-
자료형 변수명 [열의 길이][행의 길이] { 초기화 리스트 } 의 형식으로 선언한다.
#include <stdio.h> int main() { int iArr2D[2][3] = { { 1, 2, 3}, { 4, 5, 6} }; return 0; }
코드를 분석해보면 처음 대괄호 안에는 1차원 배열의 개수를 선언하였고, 두 번째 대괄호에서는 그 1차원 배열의 크기를 선언하는 것이다. 따라서 가장 바깥 중괄호는 2차원 배열안에 담을 요소를 묶은 것이고 그 안에 2개의 중괄호 묶음이 각 1차원 배열들인 것이다.
-
배열의 활용하기 위해서는 인덱스의 위치를 알고있어야한다.
2차원 배열의 인덱스 순서는 행렬의 모습과 비교하면 이해하기 쉽다.iArr2D[행][열] { [0][0] [0][1] [0][2]}, { [1][0] [1][1] [1][2]}
가로 방향으로 열이 증가하고 세로 방향으로 행이 증가한다.
2. 인덱스로 배열 접근
-
1차원 배열은 출력할 때 반복문을 사용하였다. 2차원 배열도 마찬가지이며 배열이 두 개이기 때문에 반복문도 중첩해서 사용해주면 된다.
for (int i = 0; i < 2; i++) { for (int j = 0; j < 3; j++) { printf("%d, ", iArr2D[i][j]); } printf("\n"); } // 출력결과 // 1 2 3 // 4 5 6
3. 메모리 구조
-
2차원 배열의 실제 메모리 구조는 행렬처럼 입체적 구조가 아니라 일자로 나열된 공간에 순서대로 나열된다.
그림에서 처럼 우선 두 번째 대괄호 즉 행의 크기만큼 나열하고 열의 크기 만큼 더 할당하는 형태이다.
주소를 출력해서 확인해 보면
int iArr2D[2][3] = { { 1, 2, 3}, { 4, 5, 6} }; for (int i = 0; i < 2; i++) { for (int j = 0; j < 3; j++) { printf("iArr2D[%d][%d]: %d (%p)\n", i, j, iArr2D[i][j], &iArr2D[i][j]); } }
결과
메모리주소의 값이 일정한 간격을 두고 있는걸 알 수 있다.
-
1차원 배열에서는 초기화 리스트를 써주면 크기를 직접 할당하지 않아도 요소의 수만큼 크기가 할당되었다.
2차원 배열의 경우에는 열의 크기는 생략할 수 있지만 행의 크기는 반드시 명시해 주어야한다.
int iArr2D[][3] = { { 1, 2, 3}, { 4, 5, 6} };
열의 경우 초기화 리스트에 중괄호로 구분한 수 만큼 할당하면 되지만, 행의 경우 빈 공간은 0으로 채우기 때문에 기준이 되는 크기를 알아야 하기 때문이다.
int iArr2D[][3] = { { 1, 2}, { 4, 5, 6} {} };
위 코드는 정상적으로 동작한다. 첫 번째 열의 빈 공간은 0으로 채워지고 마지막 열의 요소는 모두 0으로 채워진다.