68.2 반환값과 매개변수가 있는 함수 포인터 만들기
이번에는 반환값과 매개변수가 있는 함수 포인터를 만들어보겠습니다. 다음과 같이 반환값 자료형을 지정해주고, 맨 뒤의 괄호에 매개변수의 자료형을 지정합니다(매개변수 이름은 생략해도 됩니다).
- 반환값자료형 (*함수포인터이름)(매개변수자료형1, 매개변수자료형2);
예를 들어 int형 반환값, int형 매개변수가 두 개인 함수를 담을 수 있는 함수 포인터는 어떻게 만들까요?
int add(int a, int b) // int형 반환값, int형 매개변수 두 개 { return a + b; }
add 함수를 담을 수 있는 함수 포인터는 이렇게 만듭니다.
int (*fp)(int, int); // int형 반환값, int형 매개변수 두 개가 있는 함수 포인터 fp 선언
이제 함수 포인터를 사용해보겠습니다. 다음 내용을 소스 코드 편집 창에 입력한 뒤 실행해보세요.
function_pointer_return_parameter_type.c
#include <stdio.h> // 덧셈 함수 int add(int a, int b) // int형 반환값, int형 매개변수 두 개 { return a + b; } // 곱셈 함수 int mul(int a, int b) // int형 반환값, int형 매개변수 두 개 { return a * b; } int main() { int (*fp)(int, int); // int형 반환값, int형 매개변수 두 개가 있는 함수 포인터 fp 선언 fp = add; // add 함수의 메모리 주소를 함수 포인터 fp에 저장 printf("%d\n", fp(10, 20)); // 30: 함수 포인터로 add 함수를 호출하여 합을 구함 fp = mul; // mul 함수의 메모리 주소를 함수 포인터 fp에 저장 printf("%d\n", fp(10, 20)); // 200: 함수 포인터로 mul 함수를 호출하여 곱을 구함 return 0; }
실행 결과
30 200
int형 반환값과 int형 매개변수 두 개를 가지고 있는 add, mul 함수를 저장할 것이므로 함수 포인터를 선언할 때 반환값은 int로 지정하고, 맨 뒤의 괄호 안에는 int를 두 개 넣어줍니다. 이때 매개변수의 자료형만 알려주면 되므로 매개변수의 이름은 지정하지 않아도 됩니다.
//↓ 반환값 자료형 int (*fp)(int, int); // int형 반환값, int형 매개변수 두 개가 있는 함수 포인터 fp 선언 // ↑ ↖ int형 매개변수 두 개 // 함수 포인터 이름
이제 = (할당 연산자)를 사용하여 함수 포인터에 add 함수의 메모리 주소를 저장합니다.
fp = add; // add 함수의 메모리 주소를 함수 포인터 fp에 저장
함수 포인터 fp에 괄호를 붙여서 호출하면서 매개변수에 값을 넣습니다. 여기서는 fp에 저장된 add 함수를 호출하므로 10과 20를 더한 값인 30이 나옵니다.
printf("%d\n", fp(10, 20)); // 30: 함수 포인터로 add 함수를 호출하여 합을 구함
fp에 mul 함수를 넣어서 곱을 구할 수도 있습니다.
fp = mul; // mul 함수의 메모리 주소를 함수 포인터 fp에 저장 printf("%d\n", fp(10, 20)); // 200: 함수 포인터로 mul 함수를 호출하여 합을 구함
즉, 함수 포인터를 활용하면 상황에 따라서 함수를 바꿔가며 호출할 수 있습니다.
지금까지 함수 포인터에 대해 배웠는데 문법이 좀 복잡했습니다. 함수 포인터는 C 언어에서도 어려운 부분에 속하므로 당장은 완벽하게 이해하지 않아도 됩니다. 나중에 함수 포인터가 필요할 때마다 다시 돌아와서 찾아보면 됩니다.