본문 바로가기
C언어

[C언어] 함수포인터, function pointer 사용법

디지털노마드 2023. 1. 27.
반응형

C언어를 공부하다보면 처음에 직면하는 난관이 바로 포인터의 사용이다. 

심지어 프로그래밍을 몇년한 사람도 C언어를 한동안 안하다가 다시 하면 포인터에서 어지러움을 겪는다. 

포인터에 조금씩 지쳐갈 무렵 쉬지도 않고 한번 더 난관이 나온다. 바로 함수 포인터 (function pointer)

 

일단 사용하는 함수가 여러개 있고, 비슷한 기능을 가지고 있는 경우가 좋습니다. 

그리고 상황에 따라 1, 2, 3번의 함수를 골라서 사용할 수있는 코드를 1줄로 만드는 경우에 

함수 포인터사용이 필요합니다. 

 

if response == 1, do command_1();
else if response == 2, do command_2();
else if response == 3, do command_3();

 

위와 같은 경우에 response 의 값에 따라서 command_1 을 실행할지, command_2 또는 command_3 을실행할지 if 문으로 나누어 놓았죠. 3개여서 망정이지 10개정도 되면 화가 나기 시작합니다. 이럴때 사용하기 좋습니다. 함수를 배열로 만들어서 필요한 함수를 골라 사용하려면 함수 포인터가 필요합니다. 

 

/* header */

void command_1(void);
void command_2(void);
void command_3(void);

typedef enum{
  COM1, COM2, COM3
}COMMAND


typedef void (*COMMAND_PTR)();
extern COMMAND_PTR comId[3];
/* c code */
COMMAND_PTR comId[3] = {command_1, command_2, command_3};

void command_1(void){
  //todo
}
void command_2(void){
  //todo
}
void command_3(void){
  //todo
}

 

먼저 header 와 C code 에는 이렇게 작성합니다. 

COMMAND_PTR 이라는 함수 포인터를 사용할 것이고 comId 라는 함수포인터 배열을 만듭니다. 

comId 에는 [index] 에 따라서 순서대로 COM1, COM2, COM3 의 숫자가 들어가며 그 숫자에 따라서 command 함수를 골라서 부를 수 있습니다. 

 

이렇게 작성이 되면 외부 파일에서는 아래와 같이 사용이 가능합니다. 

/* another file */
comId[0]();
comId[1]();
comId[2]();

 

그럼 처음에 있던 if 문을 통해 response 값으로 함수를 골라내는 노력을 아래와 같이 

간단하게 변경할 수 있습니다. 

comId[response]();

 

 

반응형

댓글