C 프로그래밍 · 2 min read · Nov 22, 2025
리눅스 C 프로그래밍 튜토리얼 25부 - 함수 포인터

지금까지 진행된 이 C 프로그래밍 튜토리얼 시리즈에서는 포인터의 기본 개념과 배열에 대한 포인터 및 포인터의 배열과 같은 포인터와 관련된 여러 측면에 대해 논의했습니다. 포인터에 대한 이해를 확장하기 위해, 이번 튜토리얼에서는 함수에 대한 포인터 개념에 대해 논의하겠습니다.
C 프로그래밍 언어의 함수 포인터
변수에 대한 포인터가 있는 것처럼, 함수에 대한 포인터도 있을 수 있습니다. 다음은 함수 포인터 선언의 예입니다:
void (*fn_ptr)(int)여기서 우리는 ‘fn_ptr’이라는 함수 포인터를 정의했으며, 이는 void를 반환하고 정수를 입력으로 받는 모든 함수에 포인팅할 수 있습니다. 말할 필요도 없이, 이것은 선언 부분일 뿐입니다 - 다른 포인터와 마찬가지로, 이를 사용하려면 주소(이 경우 함수의 주소)를 할당해야 합니다.
다음은 이 포인터를 사용하는 예입니다:
#include
void print_int(int a)
{
printf("\n 정수 값은: %d\n",a);
}
int main()
{
void (*fn_ptr)(int);
fn_ptr = &print_int;
(*fn_ptr)(10);
return 0;
} 보시다시피, 우리는 먼저 정수를 입력으로 받고 void를 반환하는 ‘print_int’라는 함수를 정의했습니다. 그런 다음 ‘main’ 함수에서 ‘fn_ptr’을 ‘print_int’와 같은 함수에 포인팅할 수 있는 함수 포인터로 선언했습니다. 그 후 ‘print_int’ 함수의 주소를 ‘fn_ptr’에 할당하고, 마지막으로 포인터를 사용하여 함수를 호출했습니다.
다음은 생성된 출력입니다:
정수 값은: 10 여기서 언급할 가치가 있는 것은 마지막 두 줄에서 &와 *를 피하여 이 프로그램을 더 간단하게 만들 수 있다는 것입니다. 다음은 수정된 코드입니다:
#include
void print_int(int a)
{
printf("\n 정수 값은: %d\n",a);
}
int main()
{
void (*fn_ptr)(int);
fn_ptr = print_int;
fn_ptr(10);
return 0;
} 계속해서, 포인터의 배열처럼, 함수 포인터의 배열도 가질 수 있습니다. 예를 들어, 다음은 3개의 함수 주소를 저장할 수 있는 함수 포인터의 배열입니다.
void (*fn_ptr[3])(int)다음은 이 포인터 배열을 사용하는 예입니다:
void print_int1(int a)
{
printf("\n 정수 값은: %d\n",a);
}
void print_int2(int a)
{
printf("\n 정수 값은: %d\n",a+1);
}
void print_int3(int a)
{
printf("\n 정수 값은: %d\n",a+2);
}
int main()
{
void (*fn_ptr[3])(int);
fn_ptr[0] = print_int1;
fn_ptr[1] = print_int2;
fn_ptr[2] = print_int3;
fn_ptr[0](10);
fn_ptr[1](10);
fn_ptr[2](10);
return 0;
}다음은 이 코드에서 생성된 출력입니다:
정수 값은: 10
정수 값은: 11
정수 값은: 12함수 포인터에 대해 알아야 할 또 다른 측면은 함수 인수로 사용할 수 있다는 것입니다. 예를 들어, 함수 포인터를 인수로 받는 함수가 있을 수 있습니다. 예:
void some_random_func(void (*fn_ptr)(int)) 다음은 이 함수를 활용한 예제 코드입니다:
#include
void another_random_func(int a)
{
printf("\n 입력된 정수는: %d\n", a);
}
void some_random_func(void (*fn_ptr)(int))
{
fn_ptr(5);
}
int main()
{
some_random_func(another_random_func);
return 0;
} 여기서 우리는 ‘some_random_func’라는 함수를 만들었으며, 이는 입력으로 함수 포인터를 받습니다. 그런 다음 ‘main’에서 ‘another_random_func’의 주소를 인수로 사용하여 ‘some_random_func’를 호출했습니다. 그런 다음 포인터를 사용하여 ‘another_random_func’를 성공적으로 호출했습니다.
다음은 출력입니다:
입력된 정수는: 5 결론
함수 포인터는 ‘콜백 메커니즘’을 생성하고자 할 때 유용할 수 있습니다(여기에서 자세히 읽어보세요). 그러나 그에 들어가기 전에 이 개념을 잘 이해하는 것이 좋습니다. 이 튜토리얼의 예제를 로컬 머신에서 시도해 보시기를 권장합니다(그리고 새로운 예제를 만들어 보세요). 의문이나 질문이 있는 경우 아래에 댓글을 남겨주세요.
새 게시물을 받은 편지함에서 받기
스팸은 없습니다. 언제든지 구독 해지 가능합니다.