2015년 5월 6일 수요일

C/C++에서 배열을 함수의 인자로 넘기는 방법

 함수의 인자로 배열을 넘겨줄 때 어떻게 사용해야 되는지 살펴보도록 하겠다. 함수의 선언에서 배열이 인수인 경우 다음과 같이 사용한다.
데이터형 함수명(데이터형 배열명[])
이렇게 배열 크기를 알 수 없는 형태로 선언하는 이유는 C언어가 내부적으로 배열을 넘기는 것이 아니라 배열의 시작 주소를 넘기기 때문이다. 배열명은 함수 선언에서는 생략 가능하다. 내부적인 처리에 대한 자세한 내용은 포인터에서 더 자세히 설명하도록 하겠다.


배열을 넘겨받는 함수의 선언 예를 들어 보면 다음과 같다.
int func(int ia[]); //❶
int func(int []); //❷
위 두 가지는 컴파일러 입장에서는 동일하다. 왜냐면 배열명이 함수의 선언에서는 의미가 없기 때문이다. 따라서 함수의 인수가 int형 배열이라고 선언하는 것은 ❷번으로 충분하다.


 이렇게 선언된 함수를 호출할 때는 배열명을 이용해서 다음과 같이 한다.


func(arr)
예를 들어서


int arr[] = {1, 2, 3};
func(arr);
이렇게 하면 arr라는 int형 배열을 함수 func()로 넘겨주게 된다. 배열을 함수로 넘겨줄 때는 배열명만을 써준다는 것에 다시 한 번 주의하자.
 다음 예제는 함수에 배열이 인수로 넘어오는 것이다.
#include <stdio.h>
void showArray(int []);
int main(void) {
   int ia[] = {10,20,30,40,50};
   showArray(ia);
}
void showArray(int ia[]) {
   for (int k=0; k<5; k++)
       printf("ia[%d] = %d\n", k, ia[k]);
}


실행 결과 :
ia[0] = 10
ia[1] = 20
ia[2] = 30
ia[3] = 40
ia[4] = 50
Press any key to continue...
이 예제의 경우 showArr()함수로 넘어오는 배열은 크기가 5로 고정되어 있다고 가정하고 작성한 것이다.
 그런데 사실 함수는 인수로 넘어온 배열의 크기를 알 수 있는 방법이 없다. 따라서 다음 예제와 같이 함수에 배열을 넘길 때 배열의 크기를 추가로 넘겨주는 방법도 자주 쓰인다.


#include <stdio.h>
void showArray(int [], int);
int main(void) {
  int iaA[] = {10,20,30,40,50};
  int iaB[] = {-1, 0, 1};
  showArray(iaA, 5);
  showArray(iaB, 3);
}
void showArray(int ia[], int iLength) {
   for (int k=0; k<iLength; k++)
       printf("ia[%d] = %d\n", k, ia[k]);
}


실행 결과 :
ia[0] = 10
ia[1] = 20
ia[2] = 30
ia[3] = 40
ia[4] = 50
ia[0] = -1
ia[1] = 0
ia[2] = 1
Press any key to continue...
이 예제의 함수 선언부를 따로 보면 아래와 같다.


void showArray(int [], int);


조금 이상하게 보일지 몰라도 함수의 선언부에서는 변수명을 생략할 수 있다고 전에 설명한 적이 있다. 위의 경우는 첫 번째 배열명과 두 번째 변수명을 모두 생략한 경우이다. 즉, 이 함수의 첫 번째 인수는 int형 배열이고 두 번째 인수는 int형 변수라고 선언하는 것이다.



댓글 없음:

댓글 쓰기