함수 포인터

변수나 파일을 포인터 변수를 이용하여 접근하듯이, 함수도 포인터를 이용하여 호출할 수 있다.

함수 포인터는 함수의 실행코드의 시작주소를 가지고 있으며, 함수 포인터를 이용하여 함수를 호출할 수 있다. 배열 이름이 메모리 주소값을 가지는 상수이듯이, 함수이름도 함수의 시작코드의 주소값을 가지는 주소값 상수로 볼 수 있다.

<함수포인터의 형식>

반환자료형 (* 함수포인터변수이름)(인수 1, 인수 2 ...);

 

다음의 예제를 통해서 함수 포인터의 사용을 알아보자

 

#include <stdio.h>

int plus (int, int);
int minus (int, int);

int main()
{
       char op;
       int num1, num2;
       int *handler(int, int);

       printf(" Enter Operator <'+" or '-' : ");
       scanf ("%c", &op);
       if (op == '+') handler = plus;
       if (op == '-') handler = minus;

       printf("enter first number:");
       scanf( "%d" &num1);
       printf("enter second number:");
       scanf ("%d", &num2);
       printf("the result is %d.\n", (*handler)(num1,num2));
       return 0;
}

int plus (int a, int b) { return (a+b);}
int minus (int a, int b ) {return (a-b);}

 

functionpointer.png

 

<프로그램 설명>

int (*handler)(int, int);

함수 포인터 handler의 선언이다. 이 함수 포인터는 반환자료형이 int 형이고, 두 개의 int 형 인수를 가지는 함수를 가리킬 수 있다는 의미이다.

if( op == '+") handler=  plus;

함수 포인터 handler 가 plus() 함수를 가리키게 된다.

printf("the result is %d.\n", handler( num1, num2));

함수 포인터 handler를 이용하여 함수를 호출한다. 이때 포인터 (*)를 생략하고 다음과 같이 호출 할 수 있다.

printf("the result is %d.\n", handler (num1, num2));