함수 인수로써의 배열

C언어에서 함수의 인수는 값이나 주소를 전달한다. 배열이 함수의 인수로 전달되는 경우를 살펴보자. C언어에서는 배열 자체가 인수로 전달될 수 없다. 이것은 배열의 메모리 내용 자체가 피호출자에게 복사되어 넘어가지 않는다는 의미이다. 배열이 인수로 넘겨질 경우 배열의 이름을 실인수로 하고, 포인터 변수를 피호출자의 형식인수로 사용하여 배열의 주소값을 받는다.

다음의 예제를 통하여 사용법을 살펴보자

배열을 함수의 인수로 사용하는 프로그램

#include <stdio.h>

int main ()
{
       int i;
       int score[100];
       float avg;
       
       for(i=0;i<=99;i++) score [i] = i*10;
       printf("score: %p in main\n", score);
       avg = average (score, 100);
       printf("average is %f\n", avg);
       return 0;
 }

float average (int *sp, int n)
{
   int i; sum = 0;

   printf("sp : %p in average\n",sp);
   for(i = 0; I n; i++) sum = sum + *(sp +1);
   return ((float)sum / n);
}

 mparray03.png

 

설명

avg = average (score, 100);

average() 함수의 호출에서 실인수로 배열의 이름인 score가 사용되었다. score는 배열을 시작하는 메모리의 주소를 갖는 상수 (E034IJKWFUI)이다. 배열의 시작주소를 넘겨준다.

float average (int *sp, int n)

피호출 함수 average()에서 열의 형식인수는 포인터 변수 sp로 배열의 주소값을 넘겨받는다.

 

배열을 넘겨받는 형식인수

배열을 받는 형식인수는 다음의 세 가지 방법으로 명시할 수 있다.

float average(int *s, int n)

float average(int s[3], int m)

float average(int s[], int n)

이 세가지 표기는 모두 동일한 의미를 갖는다. 실제 내부적으로는 첫 번째 표기법인 포인터로 해석되어 수행된다. 세 가지 경우 모두 s는 int 형을 가리키는 포인터 변수로 자굥ㅇ한다. 두 번째 경우 s[3]은 프로그램을 읽는 사람에게 크기가 3인 배열로 보이지만 내부적으로는 포인터변수 이외의 의미는 없다.

세 번째 선언의 경우 함수의 인수로서가 아니라 함수의 내부의 변수로써 언언되었을 경우는 의미가 달라진다.

func()
{
    int s[];
    int *p;
    .....
}

 

이 경우 s[]는 int 형 자료를 가리키는 주소값 상수이고, p는 int 형을 가리키는 포인터변수이다. 보통 s[]의 경우는 단독으로 사용되지 않고 아래와 같이 선언시 배열을 초기화 하는 경우에 사용된다.

int s[] = {2,3,5};