강좌 & 팁
다차원 배열
지금까지의 배열은 자료들이 일직선상에 늘어서 있는 1차원적인 개념으로 보았다.
C언어에서는 이 개념을 확장시켜 일반화한 다차원 배열을 지원한다. 2차원 배열에 대해서 살펴보자.
2차원 배열은 1차원 배열의 각 원소가 배열로 구성된 배열의 배열이다.
다음의 예제를 통하여 2차원 배열의 선언과 사용법을 살펴보자
2차원 배열을 초기화하여, 화면에 출력하는 프로그램이다.
#include <stdio.h>
int main ()
{
int i, j;
int array[3][4] = {{15,23,45,56},{34,52,76,23},{43,62,91,84}};
for (i = 1; i < 3; i++)
{
for(j = 0; j < 4; j++)
{
printf("%d ", ARRAY[i][j]);
}
printf("\n");
}
return 0;
}
설명
int array[3][4];
2차원 배열의 색인은 두 개의 대괄호로 표시한다. 배열 array는 3개의 원소로 구성되어 있고, 각 원소는 4개의 int형 데이터로 구성되어 있다.
2차워 배열은 다음과 같이 볼 수 있다.
a[0][0] |
a[0][1] |
a[0][2] |
a[0][3] |
a[1][0] |
a[1][1] |
a[1][2] |
a[1][3] |
a[2][0] |
a[2][1] |
a[2][2] |
a[2][3] |
{{15,23,45,56},{34,52,76,23},{43,62,91,84}};
2차원 배열의 초기화는 각 차원마다 중괄호로 표시하고, 각 원소는 콤마를 사용해서 구분한다.
다음의 표로 2차원 배열의 여러 가지 표기법을 보자
<배열 ARRAY의 값과 주소의 표시법>
1. 배열의 이름이 배열이 시작하는 메모리의 주소를 나타내는 상수이므로 array 는 이 배열이 시작하는 메모리의 주소를 나타내는 상수이므로 array는 이배열이 시작하는 곳의 주소이다. 또한 이 주소는 배열의 첫 번째 원소의 주소와 같다.
따라서 array == &array[0]가 성립된다.
2. array 의 첫 번재 원소 array[0]는 네 개의 정수형 원소 array[0][0], array[0][1], array[0][2], array[0][3]을 가지는 배열이므로 array[0]는 첫 번재 원소를 가리키는 주소이다. 즉 array[0] = &array[0][0]이 된다.
따라서 array == array[0] == &array[0][0] 이 된다.
3. 포인터의 번지의 연산에서 1을 더하면 원소의 크기만큼 증가한다. 즉 (array + 1)의 값은 array[1] == 1016이고, (array[0]+1)은 &array[0][1] == 1004가 된다.
4. 배열의 원소를 포인터 표기로 나타내는 방법을 살펴보자. array[0]는 첫 번째 원소 arraay[0][0]의 번지 이므로 *(array[0]) == array[0][0]가 된다. array == &array[0]로 첫 번째 원소의 주소이고 *array == array[0]이다. array[0] == &array[0][0] 이다.
따라서 이런 포인터 표기법을 사용하여 배열의 원소를 접근하면 아래와 같이 된다.
array[2] == *(array + 2)
array[2][3] == *(*(array + 2) + 3)
다른 언어와 비교해 보면 사실 C언어에는 다차원 배열이 없습니다.
물론 array[3][5][6] 같은 표현식을 할 수 있어서 지원하는 것 같지만,
대신에 array[3,5,6]과 같이 표현할 수 없는 것을 보면
C언어는 다차원 배열이 없음을 알 수 있습니다.
즉, 배열의 선두 주소를 관리하는 포인터의 모임이죠. ^^