69.3 함수 포인터를 함수의 매개변수로 사용하기

이번에는 함수 포인터를 매개변수와 함수의 반환값으로 사용해보겠습니다. 먼저 함수 포인터를 매개변수로 사용하려면 함수를 만들 때 매개변수 부분에 함수 포인터를 넣어주면 됩니다.

반환값자료형 함수이름(함수포인터반환값자료형 (*함수포인터이름)(함수포인터매개변수자료형1, 함수포인터매개변수자료형2))
{
}

그럼 int형 반환값, int형 매개변수가 두 개인 함수는 매개변수로 어떻게 전달할까요?

int add(int a, int b)    // int형 반환값, int형 매개변수 두 개
{
    return a + b;
}

add 함수를 매개변수로 전달하려면 함수를 이렇게 만듭니다.

void executer(int (*fp)(int, int))
{
}

이제 함수를 완성하여 함수 포인터를 매개변수로 전달하고 사용해보겠습니다. 다음 내용을 소스 코드 편집 창에 입력한 뒤 실행해보세요.

parameter_function_pointer.c

#include <stdio.h>

int add(int a, int b)    // int형 반환값, int형 매개변수 두 개
{
    return a + b;
}

void executer(int (*fp)(int, int))    // 함수 포인터를 매개변수로 지정
{
    printf("%d\n", fp(10, 20));    // 30: 매개변수로 함수 호출
}

int main()
{
    executer(add);    // executer를 호출할 때 add 함수의 메모리 주소를 전달

    return 0;
}

실행 결과

30 

함수를 정의할 때 매개변수 부분에 함수 포인터를 그대로 만들어주면 됩니다. 따라서 함수 포인터 이름이 매개변수가 되므로 fp(10, 20)과 같이 매개변수로 함수를 호출하면 됩니다.

void executer(int (*fp)(int, int))    // 함수 포인터를 매개변수로 지정
{
    printf("%d\n", fp(10, 20));    // 30: 매개변수로 함수 호출
}

함수의 메모리 주소를 전달할 때는 함수 이름만 적어주면 됩니다. add()처럼 괄호까지 붙이면 add 함수가 호출되어 반환값이 executer에 전달되므로 주의합니다.

executer(add);    // executer를 호출할 때 add 함수의 메모리 주소를 전달

다음과 같이 executer(add);를 풀어서 쓸 수도 있습니다.

int (*fp)(int, int);

fp = add;
executer(fp);    // executer를 호출할 때 함수 포인터를 전달