116. 함수 포인터

함수 포인터는 시그니쳐를 원소 형식으로 취급해요.
두 개의 정수 형식을 입력 인자로 받고 반환 형식이 정수인 함수 포인터 변수는 int (*fun)(int ,int); 처럼 선언할 수 있어요.

그리고 fun 포인터 변수에 함수 원형이 같은 함수 이름을 대입할 수 있죠.
함수 포인터 변수는 함수 호출과 같은 방법으로 사용할 수 있어요.
또한 typedef int (*Fun)(int ,int); 처럼 함수 포인터 형식명을 정의하여 Fun fun; 처럼 변수 선언에 사용할 수도 있죠.

예를 들어 두 개의 정수를 입력 인자로 받아 두 수의 합과 차, 곱, 나누기를 하여 결과를 반환하는 함수들이 있다고 가정해요.
그리고 typedef int (*Fun)(int,int); 처럼 함수 포인터 형식명을 정의하기로 해요.
Fun 형식을 원소로 하는 배열을 선언할 수도 있죠.
그리고 각 원소에 두 수를 입력 인자로 받아 사칙 연산을 수행하여 결과를 반환하는 함수명으로 대입할 수 있어요.
그리고 배열의 원소를 함수처럼 사용할 수 있답니다.

typedef int(*Fun)(int,int); //함수 포인터 형식 Fun 정의
…중략…
Fun arr[4] = {Add,Sub,Mul,Div};
…중략…
printf(“%d\n”, arr[i](9,2));
◈ 함수 포인터 변수를 사용하는 예

#include <stdio.h>
typedef int(*Fun)(int,int); //함수 포인터 형식 Fun 정의
int Add(int a,int b);
int Sub(int a,int b);
int Mul(int a,int b);
int Div(int a,int b);
 
int main()
{
    Fun arr[4] = {Add,Sub,Mul,Div};
    int i = 0;
 
    for(i=0; i<4; i++)
    {
        printf("%d\n", arr[i](9,2));
    }
    return 0;
}  
 
int Add(int a,int b)
{
    return a+b;    
}
int Sub(int a,int b)
{
    return a-b;    
}
int Mul(int a,int b)
{
    return a*b;    
}
int Div(int a,int b)
{
    if(b)
    {
        return a/b;
    }
    return 0;
}

◈ 실행 결과

11
7
18
4