68.1 함수 포인터 만들기

함수 포인터는 먼저 함수의 반환값 자료형을 지정해주고, 함수 포인터 이름 앞에 * (애스터리스크)를 붙인 뒤 ( ) (괄호)로 묶어줍니다. 그리고 다시 괄호를 붙여 함수라는 것을 알려줍니다.

  • 반환값자료형 (*함수포인터이름)();

먼저 반환값과 매개변수가 없는 hello 함수가 있습니다.

void hello()    // 반환값과 매개변수가 없음
{
    printf("Hello, world!\n");
}

이 함수를 담을 수 있는 함수 포인터는 다음과 같이 선언합니다. 여기서 fp는 포인터 이름이며 function pointer의 약자입니다(상황에 맞게 다른 이름으로 만들어도 됩니다).

void (*fp)();    // 반환값과 매개변수가 없는 함수 포인터 fp 선언

이제 함수 포인터를 사용해보겠습니다. 다음 내용을 소스 코드 편집 창에 입력한 뒤 실행해보세요.

function_pointer.c

#include <stdio.h>

void hello()     // 반환값과 매개변수가 없음
{
    printf("Hello, world!\n");
}

void bonjour()    // 반환값과 매개변수가 없음
{
    printf("bonjour le monde!\n");
}

int main()
{
    void (*fp)();   // 반환값과 매개변수가 없는 함수 포인터 fp 선언

    fp = hello;     // hello 함수의 메모리 주소를 함수 포인터 fp에 저장
    fp();           // Hello, world!: 함수 포인터로 hello 함수 호출

    fp = bonjour;   // bonjour 함수의 메모리 주소를 함수 포인터 fp에 저장
    fp();           // bonjour le monde!: 함수 포인터로 bonjour 함수 호출

    return 0;
}

실행 결과

Hello, world!
bonjour le monde!

함수 포인터를 선언할 때는 함수 포인터와 저장될 함수의 반환값 자료형, 매개변수 자료형과 개수가 일치해야 합니다. 여기서는 반환값과 매개변수가 없는 hello, bonjour 함수를 저장할 것이므로 반환값은 void로 지정합니다. 그리고 (*fp)와 같이 함수 포인터 이름 fp 앞에 *를 붙이고 괄호로 묶어줍니다. 또한, 매개변수가 없으므로 ()만 붙이면 됩니다.

//↓ 반환값 자료형
void (*fp)();    // 반환값과 매개변수가 없는 함수 포인터 fp 정의
//     ↑   ↖ 매개변수가 없음
// 함수 포인터 이름

함수의 메모리 주소를 함수 포인터에 저장할 때는 = (할당 연산자)에 함수 이름만 지정해주면 됩니다. 함수 이름 뒤에 ()를 붙이면 함수 호출이 되므로 주의합니다.

fp = hello;     // hello 함수의 메모리 주소를 함수 포인터 fp에 저장

함수 포인터로 함수를 호출하는 방법은 간단합니다. 함수 포인터에 ()를 붙여서 호출하면 함수 포인터에 들어있는 함수가 호출됩니다. 여기서는 fp에 저장된 hello를 호출하므로 "Hello, world!"가 출력됩니다.

fp();           // Hello, world!: 함수 포인터로 hello 함수 호출

fp에는 hello 함수 대신 bonjour 함수를 넣어서 호출해도 됩니다. 즉, 함수 포인터를 사용하면 함수를 전구 소켓처럼 갈아 끼울 수 있습니다.

fp = bonjour;   // bonjour 함수의 메모리 주소를 함수 포인터 fp에 저장
fp();           // bonjour le monde!: 함수 포인터로 bonjour 함수 호출