http://www.hackerschool.org/HS_Boards/zboard.php?id=Free_Lectures&no=747 [복사]
배열(array)
C에서 배열을 아주 단순한 구조로 정의 하였다.
연속된 메모리 공간을 차지하는 같은 데이터형들의 집합이 그 정의이다. 그 이상도 그 이하도 아니다.
우선 배열은 정적인 데이터형이다. 소스 코드 상에서 반드시 그 크기를 미리 정해두어야 한다는 말이다. 컴파일러는 이 정해진 크기만큼 공간만을 확보하지 그 이상의 조치는 하지 않는다.
정의
데이터형 배열명[배열의 크기];
ex) int array[10];
위와 같이 정의되었을 때 array라는 배열 이름은 단 두 가지의 의미 밖에 없다. 첫째는 array라는 배열명은 10개의 정수가 저장된 공간의 선두 번지를 의미하는 것이고, 둘째로 sizeof(array)와 같이 하면 배열의 크기, 즉 int형이 몇 개나 저장될 수 있는가 하는 10이라는 값을 나타낼 뿐이다. 그 이외의 배열에 대한 조작은 모두 포인터의 조작으로 대치된다.
C에서는 배열의 어떠한 첨자의 검사도 하지 않는다. array[-1]같은 것들도 에러를 내지 않는다. 이점은 C에서 배열을 다루는 방법에 의한 것이며 이 같은 점이 초보자에게는 굉장한 혼란을 줄 수 있지만 이것도 C의 융통성에 포함되는 것이다.
배열의 첨자에 대한 처리는 포인터에 대한 처리로 대치 된다.
array[4]와 같은 것은 *(array+4)와 완전히 동일하다.
1차원 배열
배열의 차수는 배열 요소를 지정하는데 몇 개의 첨자가 필요하느냐에 의해서 결정된다.
생성동시에 초기화 할 수 있다.
int array[10]={1,2,3,4,5,6,7,8,9,0};
다차원배열
다차원 배열은 각 배열 요소를 지정하는데 여러 개의 첨자 요소가 쓰이는 배열을 말한다.
보통 2차원과 3차원 배열이 많이 쓰이고 그 이상은 사용이 드물다.
int array2[3][3] = {{1,2,3},{4,5,6},{7,9,8}};
앞에 첨자는 행을 나타내며 뒤에 첨자는 열을 나타낸다.
그러나 메모리에 올라갈 때는 메모리가 선형 구조기 때문에 마치 1차원 배열처럼 저장이 된다. 1,2,3,4,5,6,7,8,9,0 이런 식으로 저장이 된다.
배열의 제일 처음공간을 주소라고 했는데 array2+1를 하면 2를 가르치는 것이 아니라 4를 나타낸다. array2는 3개의 int형 공간을 가르키게 된다.
C의 문법은 완전히 재귀적 이라는 것을 생각하면 2차원 배열이 이런 복잡한 구조를 갖는다는 데에 수긍이 갈 것이다.
1차원 배열을 함수의 인자로 넘기는 방법
int average(int a[],int n)
{
int sum=0;
int i;
for(i=0; i < n;i++)
sum+=a[i];
return (sum/n);
}
C에서 배열의 크기는 메모리 공간을 할당할 때만 필요하지 실행시에는 배열의 크기에
대해서 컴파일러가 신경써주지 않는다. 그래서 함수가 배열을 인자로 받을 때 그배열이 몇 개의 요소를 가지는지는 전혀 알 방법이 없다. 이런 유로 average()함수는 n이라는 배열의 크기를 인자로 따로 받는다. 그리고 인자로 받는 배열 a에도 []로 배열표시만 했지 크기를 명시하지 않음을 알 수 있다.(크기를 명시해도 컴파일러는 이것을 무시한다.)
물론 배열 자체에 배열의 끝을 나타내는 요소가 있으면 배열의 크기를 넘길 필요가 없다.
가장 구체적인 예가 바로 문자열을 다루는 방식이다. 문자열 끝에는 NULL 문자가 끝에 붙어 있기 때문이다. 배열을 읽어 가다가 NULL이 읽어지면 배열의 끝임을 알게 되는 것이다.
int average(int *a, int n) //포인터로 표현
2차원 배열을 함수의 인자로 넘기는 방법
2차원 배열을 함수의 인자로 넘기는 방법은 주의를 요한다. C는 프로그램이 실행한 뒤에는 배열의 크기를 모른다고 하였기 때문에 1차원 배열에서는 함수의 인자로 배열을 넘길 때 배열의 크기를 명시하지 않고 따로 배열의 크기를 정수로 넘겨주었다.
하지만 2차원 배열은 얼핏보면 그 원칙에 어긋나는 것 같다.
2차원 배열은 얼핏보면 그 원칙에 어긋나는 것 같다.
2차원 배열을 사용하는 가장 빈번한 예는 행렬이다. 다음의 input_matrix() 함 수는 2*2 행렬을 키보드로 입력 받는 함수이다.
void input_matrix (int m[][2],int n)
{
int i, j;
printf(“\n input %d by %d Matrix in row order ->”,n,n);
for (i=0; i<n ; i++)
for(j=0; j<n; j++)
scanf(“%d”,&m[i][j]);
}
배열의 크기를 모른다고 했는데 위의 input_matrix() 함수의 인자에는 int m[][2]라고 쓰여 있어 2라는 크기가 들어갔음을 알 수 있다.
m을 포인터라고 보았을 때 int m[][2]의 표현은 m이 두 개의 int형의 공간을 가리키는 포인터이다. 즉 m[][2]의 표현은 배열의 크기를 나타낸 것이 아니라 m이 어떤 형의 데이터를 가리키는 포인터인지 나타내는 것이다.
이것을 포인터로 표현하면
void input_matrix(int *(m[2]),int n)
포인터로 표현하니 더 의미가 명확하다. 2개의 int 공간을 가리키는 포인터 m의 정체가 학연히 드러난다.
다차원 배열을 함수의 인자로 넘기는 방법
다차원 배열은 2차원 배열을 함수의 인자로 넘기는 방법의 연장선상에 있다. 즉 다차원 배열을 함수의 인자로 넘길 때에는 2차원 배열과 마찬가지로 가장 큰 블록을 가리키는 최좌측 첨자를 비워두고 나머지 첨자는 그 크기를 명시하는 것이다.
int tri[3][4][2];
int func(int t[][4][2])
{
……….
}
|
Hit : 7833 Date : 2007/06/14 09:36
|