웹사이트 검색

Linux C 프로그래밍 자습서 25부 - 함수 포인터


이 페이지에서

  1. C 프로그래밍 언어의 함수 포인터\n
  2. 결론

지금까지 진행 중인 이 C 프로그래밍 자습서 시리즈에서 포인터의 기본 개념과 배열에 대한 포인터 및 포인터 배열과 같은 포인터와 관련된 몇 가지 측면에 대해 논의했습니다. 포인터에 대한 이해를 확장하여 이 자습서에서는 함수에 대한 포인터의 개념에 대해 설명합니다.

C 프로그래밍 언어의 함수 포인터

변수에 대한 포인터가 있는 것처럼 함수에 대한 포인터도 있을 수 있습니다. 다음은 함수 포인터 선언의 예입니다.

void (*fn_ptr)(int)

따라서 여기에는 void를 반환하고 정수를 입력으로 받는 모든 함수를 가리킬 수 있는 fn_ptr이라는 함수 포인터가 있습니다. 말할 필요도 없이 이것은 단지 선언 부분일 뿐입니다. 다른 포인터와 마찬가지로 포인터를 사용하려면 주소(이 경우 함수의 주소)를 할당해야 합니다.

다음은 이 포인터를 사용하는 예입니다.

#include <stdio.h>

void print_int(int a)
{
printf("\n The integer value is: %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와 같은 함수를 가리킬 수 있는 함수 포인터로 선언했습니다. 이어서 fn_ptr에 print_int 함수의 주소를 할당하고 마지막으로 포인터를 이용하여 함수를 호출한다.

생성된 출력은 다음과 같습니다.

The integer value is: 10 

여기서 언급할 가치가 있는 것은 마지막 두 줄에서 & 및 *를 피함으로써 이 프로그램을 더 단순화할 수 있다는 것입니다. 수정된 코드는 다음과 같습니다.

#include <stdio.h>

void print_int(int a)
{
printf("\n The integer value is: %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 The integer value is: %d\n",a);
}

void print_int2(int a)
{
printf("\n The integer value is: %d\n",a+1);
}

void print_int3(int a)
{
printf("\n The integer value is: %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;
}

이 코드에 의해 생성된 출력은 다음과 같습니다.

The integer value is: 10 

The integer value is: 11

The integer value is: 12

알아야 할 함수 포인터의 또 다른 측면은 함수 인수로도 사용할 수 있다는 것입니다. 예를 들어 함수에 대한 포인터를 인수로 받아들이는 함수가 있을 수 있습니다. 예를 들어:

void some_random_func(void (*fn_ptr)(int)) 

다음은 이 기능을 활용하는 예제 코드입니다.

#include <stdio.h>

void another_random_func(int a)
{
printf("\n The integer to entered is: %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를 성공적으로 호출했습니다.

결과는 다음과 같습니다.

The integer to entered is: 5 

결론

함수 포인터는 콜백 메커니즘이라는 것을 만들고 싶을 때 유용할 수 있습니다(자세한 내용은 여기 참조). 하지만 시작하기 전에 이 개념을 잘 이해하는 것이 좋습니다. 로컬 컴퓨터에서 이 자습서의 예제를 시도하고 새 예제를 만드는 것이 좋습니다. 의심이나 질문이 있는 경우 아래에 의견을 남겨주십시오.