함수 인자로 함수를 넘겨 줄 수 있습니다. (정확히는 함수의 시작주소를 넘겨줌)
http://codepad.org/yawaDRbI


void fooA(void){ printf("함수 A\n"); }
void fooB(void){ printf("함수 B\n"); }
void fooC(void){ printf("함수 C\n"); }

void foo(void (*fp)(void)){ fp(); }

int main(void)
{
        foo(fooA);
        foo(fooB);
        foo(fooC);
        return 0;
}

유의해야 할 점은 리턴타입 / 매개변수 타입을 맞춰주어야 한다는 것이빈다.

이런식으로 사용이 가능하다는 얘기죠.
http://codepad.org/DCWCESFP

int plus(int a,int b){ return a+b; }
int minus(int a,int b){ return a-b; }

int foo(int a,int b,int (*fp)(int,int)){ return fp(a,b); }

int main(void)
{
        printf("%d\n",foo(15, 10, plus));
        printf("%d\n",foo(15, 10, minus));
        return 0;
}


물론 함수포인터도 배열로 생성 가능하니, 배열 인덱스에 따라서 switch 그딴거 없이 상황에 맞게 호출 할 수도 있습니다.
http://codepad.org/EAqooPCT

int plus(int a,int b){ return a+b; }
int minus(int a,int b){ return a-b; }

int foo(int a,int b,int (*fp)(int,int)){ return fp(a,b); }

int main(void)
{
        int i;
        int (*fp[2])(int,int)={plus,minus};
//        fp[0]=plus;        fp[1]=minus;
        for(i=0;i<2;i++)
                printf("%d\n",foo(15, 10, fp[i]));
        
        return 0;
}

아니면 일정 상황이 되었을때 해당 함수를 호출해 주는 형태로도 가능합니다.
http://codepad.org/LG9H0NDU


static int (*g_fp)(int,int);

int plus(int a,int b){ return a+b; }
int minus(int a,int b){ return a-b; }

void SetFp(int (*fp)(int,int)){ g_fp=fp; }

int foo(int a,int b){ return g_fp(a,b); }

int main(void)
{
        SetFp(plus);
        printf("%d\n",foo(15, 10));

        SetFp(minus);
        printf("%d\n",foo(15, 10));

        return 0;
}

출처 - 유리한

Posted by 명혀니
,