앞에서 1차원 배열에 대해 알아봤었다. 이번에는 다차원 배열을 대표하는 2차원, 3차원 배열에 대해 알아볼 것이다.
2차원 배열
선언방식은 다음과 같다.
int arr[2][2];
1차원 배열과 선언방식이 유사하다. 다만 2차원 배열은 평면 구조를 띄기 때문에 가로와 세로의 길이를 각각 명시한다.
2차원 배열요소의 접근
모든 배열요소가 0으로 초기화된 배열 int arr[3][3]이 있다고 하자.
arr[0][0] = 1이 실행되면 가로 0번째 세로 0번째 위치에 1이 삽입되는 것이다.
이어서 arr[0][1] = 2를 실행하면 가로 1번째 세로 0번째 위치에 2가 삽입된다.
2차원 배열을 for문을 통해 접근하려면 2중 for문을 써야 한다.
for(int i=0; i<3; i++) {
for(int j=0; j<3; j++) {
arr[i][j] = scanf("%d", &arr[i][j]);
}
}
2차원 배열 선언과 동시에 초기화
1차원 배열과 같이 2차원 배열도 선언과 동시에 초기화가 가능하다.
가장 일반적인 초기화 방법은 다음과 같다.
int arr[3][3] = { {1, 2, 3},
{4, 5, 6},
{7, 8, 9} };
이와 같이 행 단위로 초기화할 값들을 별도의 중괄호로 명시해야 한다.
또한 초기화를 생략할 수 있다.
int arr[3][3] = { {1},
{4, 5},
{7, 8, 9} };
초기화가 생략이 된 부분은 자동으로 0으로 초기화된다.
다음과 같은 초기화 방법도 가능하다.
int arr[3][3] = {1, 2, 3, 4, 5, 6, 7, 8, 9};
중괄호 없이 초기화 리스트를 나열한 것인데, 이렇게 초기화할 때는 0행 0열부터 차례로 초기화가 된다.
배열의 크기를 알려주지 않고 초기화하기
2차원 배열도 초기화 리스트가 존재하면, 배열의 길이를 명시하지 않아도 된다.
하지만 2차원 배열은 1차원 배열과 달리 제약사항이 있다.
int arr[][] = {1, 2, 3, 4, 5, 6, 7, 8, 9};
이러한 배열이 있을 때 컴파일러가 가로, 세로의 길이를 알 수 없어 에러가 뜬다.
이러한 문제를 해결하기 위해 2차원 배열에서는 세로의 길이만 생략이 가능하도록 한다.
int arr[][3] = {1, 2, 3, 4, 5, 6, 7, 8, 9};
이렇게 하면 가로의 길이가 3이므로 세로의 길이는 배일의 크기 / 가로의 길이를 하여 3이 된다.
3차원 배열
2차원 배열을 이해했다면, 3차원 배열도 이해하고 있다 보면 된다.
2차원 배열이 평면구조라면, 3차원 배열은 정육면체의 구조이다. 가로, 세로에 높이라는 개념이 추가가 된다.
3차원 배열의 선언과 접근
int arr[3][3][2] = { { {1, 2},
{3, 4},
{5, 6} },
{ {5, 6},
{7, 8},
{9, 10} },
{ {11, 12},
{13, 14},
{15, 16} }
};
이 배열은 높이 3 세로 3 가로 2인 배열이다. 2차원 배열의 초기화 리스트는 1차원 배열의 초기화 리스트가 다수 모여있는 형태였다. 3차원 배열의 초기화 리스트는 2차원 배열의 초기화 리스트가 다수 모여있는 것과 같다.
따라서 3차원 배열은 여러 개의 2차원 배열이 모여있는 형태로 이해하는 것이 더 합리적이다.
'Programming > C' 카테고리의 다른 글
C언어 - 다차원 배열과 포인터의 관계 (2) | 2021.10.04 |
---|---|
C언어 - 포인터의 포인터(다중 포인터) (0) | 2021.10.02 |
C언어 - 포인터와 함수에 대한 이해 (4) | 2021.09.30 |
C언어 - 포인터와 배열 (0) | 2021.09.29 |
C언어 - 포인터의 이해 (0) | 2021.09.27 |
댓글