Public/tip & tech

복잡한 함수포인터 (고급)

quantapia 2009. 5. 12. 17:59

 

 

참고: 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)) )