david's daily developer note

[C,C++] 함수를 인자로 전달하는 방법 본문

[Develop] Native/C++ , C

[C,C++] 함수를 인자로 전달하는 방법

mouse-david 2010. 6. 27. 03:10
728x90

함수에 인자로 넘겨주는 방법은 다음과 같다.
1. 복사를 통한 값 전달 방법 (Call by value)
2. 데이터의 주소 전달하는 방법 (Call by reference)

이 번글에서는 함수를 인자로 전달하는 방법을 메모한다.

컴파일 시점에, 함수는 함수안의 지역변수와 자신을 호출한 함수의 주소 등을 스택 공간에 저장하며, 자신의 호출 주소도 부여받는다. 이때 파싱된 함수의 호출 주소는 함수의 주소를 저장하는 테이블에 저장된다.

C 언어는 순차적인 언어로 일반 콘솔로 실행할 경우  main 문의 선언문 부터 시작해서 종료할때 까지 순차적으로 실행하는데 그 과정에서 함수를 호출하는 코드를 만나면 해당 하는 함수의 주소를 파싱된 함수 주소 테이블에서 찾아서 해당 함수의 주소로 점프한다.

이과정에서 자신을 수행한 명령줄의 주소를 스택에 저장하고, 호출한 함수의 주소를 스택에 저장한다.
호출된 함수의 수행이 종료하면 스택에서 호출된 함수의 주소를 제거하고 스택 하위에 존재하는 호출한 주소로 다시 복귀하게 되는 과정이다.

int add(int a, int b) {
    return a+b;
}     

int mul(int a, int b) {
    return a*b;
}

int sub(int a, int b) {
    return a-b;
}

int process(int (*pf)(int, int), int x, int y) {
    return (*pf)(x,y);
}

void main() {
    printf("add = %d\n",process(add,8,4));
    printf("multiply = %d\n",process(mul,8,4));      
    printf("subtract = %d\n",process(sub,8,4));
}

 

위 코드는 함수 포인터를 인자로 넘기는 코드 예시이다.

process 함수는 int(*pf)(int ,int) 라는 인자를 받는 것을 확인할수 있다. 
여기서 int * pf() 일경우 반환값이 정수형 포인터 라는 뜻이지만 int (*pf)() 는 함수의 포인터 라는 의미이다.
 
main 문에서 process 함수에 add,mul,sub와 같이 함수를 전달한다.
배열을 포인터로 받을경우 첫주소를 가르키는 주소상수 a를 인자로 넘기는 것과 같이 함수의 주소를 넘길때에도 동일하다. 

 

728x90