참고: http://blog.naver.com/asca99?Redirect=Log&logNo=80013311806
#include
int max(int a, int b){ return (a > b) ? a : b; }
int min(int a, int b) { return (a > b) ? b : a; }
int mod(int a){ return a%2;}
int (* p(int a, int b) )(int, int)
{
printf("a = %d\tb=%d\n", a, b);
return &max;
}
int (* m(int a, int b) )(int, int){ return &min; }
//int (* 나) (int, int)
//int (* act(int x, 가) )(int, int) = int (* p(int a, int b) )(int, int) = 나
//int (* (* act(int x, int (*f_p)(int)) )(int, int) )(int, int) = 다
//int (* act(int x, int (*f_p)(int)) )(int, int) = int (* p(int a, int b) )(int, int) = 나
//int (*f_p)(int) = int mod(int a) = 가
int (* (* act(int x, int (*func_p)(int)) )(int, int) )(int, int)
{
if ( func_p(x) ) { return &p; }
else { return &m; }
}
int main(void)
{
int val = act(9, mod)(20, 30)(30, 70);
printf("val = %d\n", val);
return 0;
}
부가 설명
함수 포인터를 사용하기 위해서는 파라미터와 리턴형을 맞추어줘야 한다.
예를 들면
int test(int a, char b) 를 포인팅하는 함수 포인터를 선언하기 위해서는
리턴형 int 와 파라미터 int a, char b의 형태를 맞춰줘야 한다.
다시 말해 int (*funcp)(int a, char b)와 같은 형태를 취한다.
int (* (* act(int x, int (*func_p)(int)) )(int, int) )(int, int)
함수에 대해 설명을 하면
가장 안쪽 소괄호부터
int (*func_p)(int) = '가'로 표시
리턴형이 int 이고 int형 파라미터를 갖는다.
그럼 그 다음 소괄화
(* act(int x, 가) )(int, int) = int (* act(int x, 가) )(int, int) = '나'로 표시
이것도 처음 설명한 int (*func_p)(int)와 다르지 않다.
우선 안쪽을 살펴보면
int형 파라미터를 두개 갖는다.
리턴형은 int 형?
아니다. 이것은 리턴형이 함수포인터이다.
뒤에 보면 int형 파라미터를 두개갖고 리턴값이 int형인 함수포인터를 리턴하는 형태이다.
int (* 나)(int, int)
이건도 역시 제일 먼저 설명했던 funcp와 같은 형태이다
리턴값이 int이고 두개의 int 형 파라미터를 갖는다..
int val = act(9, mod)(20, 30)(30, 70);
이부분을 보고 설명을 하면 다음과 같다.
mod 가 실행된다. 파라미터로 9가 들어가고 1가 리턴된다(9%2)
따라서 if(mod(x))는 참이되고
p가 실행된다.
함수 p는 act의 두번째 파라미터 (20,30)을 입력으로 받고
각각을 프린트한 다음 max를 실행한다.
(30,70)중에 큰값을 리턴한다.
int (* k(int , int ) )(int, int) = int (* (* act(int x, int (*func_p)(int)) )(int, int) )(int, int)
int (* p(int a, int b) )(int, int)
k = (* act(int x, int (*func_p)(int)) )