Programming Languages/C

11 함수 포인터

ubiquitous4g 2021. 5. 8. 16:06

 

- 함수 이름은 함수의 메모리 시작 주소를 가리키는 함수 포인터(function pointer)다.

- 함수 포인터는 다음 예제처럼 함수를 또 다른 함수의 인수로 전달할 때 유용하게 사용된다.

 

- 함수 포인터 선언 방법

함수 포인터의 포인터 타입은 함수의 반환값과 매개변수에 의해 결정된다.

즉, 함수의 원형을 알아야만 해당 함수에 맞는 함수 포인터를 만들 수 있다.

 

// 함수 원형
void func (int, int);

// 함수 포인터
void (*ptr_func) (int, int);

 

- 함수 포인터 사용시, 연산자 우선순위에 의해 *ptr_func 부분을 괄호(())로 둘러싸야 한다.

 

- 함수에 대한 포인터는 매개변수 선언시, 변수 이름앞 *와 ( )를 생략 할 수 있다.

 

#include <stdio.h>

double add(double, double);
double sub(double, double);
double mul(double, double);
double div(double, double);
double calculator(double, double, double (*func)(double, double));

int main(void)
{
    double (*calc)(double, double) = NULL; // 함수 포인터 선언
    double result = 0;

    double num01 = 3, num02 = 5; // 매개변수 숫자
    char oper = '*'; // 연산자 선택값

    switch (oper)
    {
    case '+':
        calc = add;
        break;
    case '-':
        calc = sub;
        break;
    case '*':
        calc = mul;
        break;
    case '/':
        calc = div;
        break;
    default:
        puts("사칙연산(+, -, *, /)만을 지원합니다.");
    }

    result = calculator(num01, num02, calc);
    printf("사칙 연산의 결과는 %lf입니다.\n", result);
    return 0;
}

double add(double num01, double num02)
{
    return num01 + num02;
}

double sub(double num01, double num02)
{
    return num01 - num02;
}

double mul(double num01, double num02)
{
    return num01 * num02;
}

double div(double num01, double num02)
{
    return num01 / num02;
}

double calculator(double num01, double num02, double (*func)(double, double))
{
    return func(num01, num02);
}