68.0 함수 포인터 사용하기

C 언어에서 함수는 이름이 정해져 있죠. 그래서 함수를 호출하려면 함수 이름으로 직접 호출했습니다.

void hello()
{
    printf("Hello, world!\n");
}

int main()
{
    hello(); // 함수 이름으로 함수를 직접 호출

    return 0;
}

그럼 함수를 배열 또는 구조체에 넣거나, 함수 자체를 함수의 매개변수로 넘겨주고, 반환값으로 가져올 수는 없을까요? C 언어는 이런 상황을 위해서 함수 포인터라는 것을 만들어두었습니다. 함수 포인터는 함수를 저장하는 포인터를 뜻하며 함수 포인터를 주고 받거나 함수 포인터로 함수를 호출할 수 있습니다.

그림 68‑1 함수 포인터의 다양한 활용

실제로 함수 이름도 포인터이므로 printf에서 출력해보면 메모리 주소가 나옵니다.

void hello()
{
    printf("Hello, world!\n");
}

int main()
{
    printf("%p\n", hello); // 00D1137F(32비트): 함수 이름도 포인터이므로 메모리 주소가 출력됨

    return 0;
}

실행 결과

00D1137F (메모리 주소. 컴퓨터마다, 실행할 때마다 달라짐)

이번 유닛부터 함수 포인터를 만드는 방법과 활용 방법을 알아보겠습니다. 참고로 함수 포인터는 문법이 복잡합니다. 따라서 애스터리스크와 괄호 사용 방법을 눈여겨 보는 것이 좋습니다.