- 함수 이름은 함수의 메모리 시작 주소를 가리키는 함수 포인터(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);
}