함수 포인터 Programming/C 2015. 8. 27. 10:32

Ⅰ. 함수 포인터 


함수 포인터를 정의 내리기 전에 먼저 포인터에 대해 다시 한번 생각해 보도록 합시다.

포인터란 특정 변수에 대한 메모리 주소를 담을 수 있는 변수를 포인터 변수라고 합니다.


그렇다면 함수 포인터는 무엇일까요?  

함수 포인터란, 특정 함수에 대한 메모리 주소를 담을 수 있는 것입니다.


🃟 함수 포인터를 사용하는 이유는 무엇일까요?


🀱 프로그램 코드가 간결해 집니다.

🀲 함수 포인터를 배열에 담아서도 사용이 가능하므로 중복되는 코드를 줄일 수 있습니다.

🀳 상황에 따라 해당되는 함수를 호출 할 수 있어 유용합니다.




​Ⅱ. 함수 포인터의 사용

 

함수 포인터의 모양은 자료형 (*함수 포인터 이름) (자료형) 의 형식으로 사용합니다.

만약 함수들이 아래와 같은 경우


int (*FuncPtr) (int a, int b);

int add(int a,int b);

double div(double a,double b);


1. FuncPtr = add 

2. FuncPtr = &add

3. FuncPtr = div

4. FuncPtr = add()


다음 중 한가지 경우로 사용한다면, 1번과 2번은 괜찮은 방법이나 3번은 자료형이 다르기 때문에,

4번은 결과 값이 함수의 리턴 값이 되므로 안됩니다.



​Ⅲ. 함수 포인터 예제 




#include <stdio.h>



typedef int (*calcFuncPtr)(int, int);




int plus (int first, int second)

{

    return first + second;

}


int minus (int first, int second)

{

    return first - second;

}


int multiple (int first, int second)

{

    return first * second;

}


int division (int first, int second)

{

    return first / second;

}


int calculator (int first, int second, calcFuncPtr func)

{

    return func (first, second);

}


int main(int argc, char** argv)

{

    calcFuncPtr calc = NULL;

    int a = 0, b = 0;

    char op = 0;

    int result = 0;

    

    printf("Input : ");

    scanf ("%d %c %d", &a, &op, &b);

    

    switch (op)

    {

        case '+' :

            calc = plus;

            break;

            

        case '-':

            calc = minus;

            break;

            

        case '*':

            calc = multiple;

            break;

            

        case '/':

            calc = division;

            break;

    }

    

    result = calculator (a, b, calc);

    

    printf ("result : %d", result);

    

    return 0;

}



위의 코드는 함수 포인터를 사용한 계산기 코드입니다.


<실행 결과>







다음과 같이 정상적으로 작동 합니다.


 



'Programming > C' 카테고리의 다른 글

[ 선린 ] Pointer 과제  (0) 2015.08.31
[ Project ] Wild!  (0) 2015.08.27
[ Project ] Stack_Linked List  (0) 2015.08.27
연결 리스트 ( Linked List )  (0) 2015.08.27
구조체 ( Struct )  (0) 2015.08.27