본문 바로가기

고급C,C++

[고급C언어] 함수포인터


① 함수 포인터의 정의

함수를 가리키는 포인터를 정의하는 것은 여타의 포인터 변수 정의처럼 상당히 쉬운 작업이다.

type (*name)(arg list);

name은 함수를 가리킬 수 있는 포인터 변수이다. (그러므로 name에 대한 4바이트가 할당된다.)

"type"은 name이 가리키는 함수가 리턴하는 형(type)을 말하고 "arg list"는 name이 가리키는 함수의 매개변수 리스트이다.

 

int (*imsi)(int, char *);

imsi가 가리키는 함수는 int형을 리턴하고 인자로 "int"와 "char *"를 가진다.

 

 

② 함수 포인터 호출

함수 포인터를 초기화 한다는 것은 만들어 놓은 함수 포인터 변수에 함수를 대입하는 과정이다. 함수를 대입한다기 보다는 함수가 저장된 곳의 번지를 할당하는 것이다.

 

int add(int, int);

int (*imsip)(int, int);

 

imsip = add;

add()라는 함수는 두 개의 인자를 받아들여 이를 더하고 결과 값을 리턴한다고 가정하자. imsip는 함수를 가리킬 수 있으므로 imsip에 add()라는 함수를 할당한다. 그런데 "imsip = &add"가 아니라 "imsip = add"를 사용하였다. 함수명은 수식 내에서 함수를 가리키는 주소로 자동변환되기 때문에 이와 같은 수식이 가능하다.

 

 

③ 함수 포인터 호출

ANSI-C는 '*' 연산자를 생략할 수 있도록 규정했으므로 생략된 형식을 주로 많이 사용한다. 만약 함수 포인터라는 것을 명확히 하고 싶다면 두번째 수식을 사용하는 것도 괜찮다.

imsi = add(5, 4);

imsi = imsip(5, 4);

imsi = (*imsip) (5, 4);

 

 

④ 함수 포인터 사용 예제

#include<stdio.h>

#include<string.h>

 

main()

{

    int add(int, int);

    int mul(int, int);

 

    int (*imsip)(int, int);

    int operation, one, two;

 

    printf("input (oper num num) : ");

    scanf("%c %d %d", &operation, &one, &two);

 

    if(operation == '+')

        imsip = add;

    else

        imsip = mul;

 

    printf("result %d\n", imsip(one,two));

}

 

int add(int one, int two)

{

    return one + two;

}

 

int mul(int one, int two)

{

    return one * two;

}

imsip는 add()라는 함수나 mul()이라는 함수를 상황에 따라 모두 가리킬 수 있다. 사용자가 '+' 연산자 후 두 개의 숫자를 입력하면 imsip에 add() 함수의 주소가 할당되고 '*' 연산자 후 두 개의 숫자를 입력하면 imsip에는 mul()함수의 주소가 할당될 것이다. '+' 일때는 add()함수로 분기해도 되는 프로그램이므로 효용성이 반감될 수 있지만 함수 포인터에 여러 함수를 대입할 수 있다는 개념을 익히기에는 충분하다. 위의 프로그램에서 장점이라고 한다면 함수 호출이 간견하다는 것과 printf()문을 딱 한번만 사용해도 된다는 것이다.

 

지금까지 보인 것은 1차원 함수 포인터 였는데 2차원 함수 포인터도 얼마든지 가능하다

#include<stdio.h>

main()

{

    int add(int);

    int mul(int);

 

    int (*func[2])(int);

    int i;

 

    func[0]=add;

    func[1]=mul;

 

    for(i=0;i<100;i++)

        if((i%2)==0)

            printf("func[0] %d\n", func[0](i));

        else

            printf("func[1] %d\n", func[1](i));

}

 

int add(int imsi)

{

    return imsi + imsi;

}

 

int mul(int imsi)

{

    return imsi * imsi;

}

 

[출력결과]

 

func[0]       0

func[1]       1

func[0]       4

func[1]       9

func[0]       8

func[1]      25

func[0]      12

func[1]      49

func[0]      16

func[1]      81

func[0]      20

    :

    :

 

 

 

 

 

 

 

 

 

출처: 다시 체계적으로 배우는 C언어 포인터(정보문화사:정재은 저)