11-3-라.이차 배열 인수

일차 배열을 함수의 인수로 전달할 때는 단순 포인터와 개수를 함께 넘겼다. 이차 이상의 배열을 함수로 넘길 때는 배열 포인터를 사용해야 한다. 단순 포인터를 넘기면 배열의 시작 위치만 알 수 있으며 개수를 함께 넘기더라도 배열의 모양은 알 수 없을 것이다.

 

: TwoArrayPara

#include <Turboc.h>

 

void func(int (*ar)[3],int size)

{

     int i,j;

 

     for (i=0;i<size;i++) {

          for (j=0;j<3;j++) {

              printf("ar[%d][%d]=%d\n",i,j,ar[i][j]);

          }

     }

     puts("");

}

 

void main()

{

     int ar1[2][3]={{1,2,3},{4,5,6}};

     int ar2[3][3]={{7,8,9},{10,11,12},{13,14,15}};

 

     func(ar1,2);

     func(ar2,3);

}

 

func는 이차원 배열을 전달받아 그대로 출력하기만 하는데 크기 3의 배열 포인터와 개수를 인수로 취한다. 배열 인수 표기법에 따라 다음과 같이 표기할 수도 있다.

 

void func(int ar[][3],int size)

 

ar은 반드시 크기 3의 정수형 배열 포인터여야 하며 size는 이런 배열의 개수이다. func는 두 번째 첨자가 3이 아닌 배열은 전달받지 못하는 셈이다. 결국 이차원 이상의 배열도 그 요소가 배열인 1차원 배열로 취급되어 시작 번지와 개수를 넘기는 방식이라고 할 수 있다. 만약 임의의 모양을 가지는 이차원 배열을 함수로 전달하려면 단순형 포인터로 시작 번지를 전달하고 별도의 인수로 폭과 높이를 따로 알려 주는 방법밖에 없다.

이차원 배열을 인수로 전달하는 방법은 사실 거의 실용성이 없고 실제 프로젝트에서 사용할 일도 없다. 왜냐하면 이차원 정도의 배열이면 프로그램의 핵심 자료 구조로 사용될 확률이 높고 이런 배열은 으례히 전역적으로 선언되기 때문이다. 그러므로 모든 함수들이 이 배열을 자유롭게 읽고 쓸 수 있으며 함수의 인수로 전달할 필요가 없는 것이다. 설사 그럴 일이 있다 하더라도 이차원 배열 단독으로 전달되는 경우보다는 구조체의 멤버로 포함되어 전달되는 경우가 압도적으로 많기 때문에 이차원 배열 인수란 큰 의미가 없다고 할 수 있다.