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를 호출할 때 함수 포인터를 전달