2015년 5월 6일 수요일

C/C++ 언어에서 포인터를 함수의 인자로 넘기기

 어떤 함수의 내부에서 호출하는 쪽의 변수를 직접 조작하려면 그 변수의 포인터를 넘겨받으면 된다. 이렇게 변수의 포인터를 넘겨 받아서 호출하는 함수의 변수를 직접 접근하는 방식을 참조에 의한 호출(call-by-reference) 라고 한다. 프로그래밍에서  참조(reference)라는 용어는 주소(address)와 거의 같은 의미로 사용된다.

 다음 예제를 살펴보자.

#include <stdio.h>
void addOne(float *); // 함수 선언

int main()
{
   float fa = 10.0f;
   addOne(&fa);
   printf("fa=%f\n",fa);
}

void addOne(float *fpa){
   *fpa += 1.0f;
}

 이 예제에서 addOne()함수는 float형 포인터를 받아서 fpa에 저장한다. addOne()함수에 &fa 를 넘긴 것을 눈여겨 보아야 한다. 그리고 내부에서 *fpa 값을 1,0만큼 증가시킨다. 하지만 addOne() 함수의 *fpa 는 main()함수의 fa 변수와 같다. 따라서 fa변수를 직접 조작하는 효과가 나는 것이다. 실행 결과를 보면 다음과 같다.

fa=11.000000

함수를 선언할 경우에는 굳이 인자의 이름을 써 줄 필요가 없고 인자의 자료형만 밝혀주면 된다. 위의 예제에서

void addOne(float *fpa);
void addOne(float *);//이렇게 인자의 이름 fpa를 생략해도 됨

라고 addOne()함수를 선언했는데 이 함수의 첫 번째 인자가 float형 포인터(float *)라고 명시한 것이다.

 다른 예로 두 변수의 값을 바꾸는 swap()함수를 작성해 보자.

#include <stdio.h>
void swap(int*, int*); // 함수 선언

int main()
{
   int ia = 11, ib = 22;
   swap(&ia, &ib);
   printf("ia=%d, ib=%d\n", ia, ib);
}

void swap(int *ipa, int *ipb){
   int itmp = *ipa;
   *ipa = *ipb;
   *ipb = itmp;
}

ia = 22, ib = 11

이 예에서 swap()함수는 두 개의 int형 포인터를 받는다. 그리고 그 내부에서 *ipa와 *ipb 값을 교환했는데 이는 main()함수에서 ia, ib를 바꾼 것과 같은 효과를 가진다.


댓글 없음:

댓글 쓰기