본문 바로가기

Native/C

Function pointer(함수포인터)

[code]
#include <Turboc.h>

int func(int a)
{
return a*2;
}

void main()
{
int i;
int (*pf)(int a);

pf=func;
i=(*pf)(2);
printf("%d\n",i);
}
[/code]
[code]
#include <Turboc.h>

int multi2(int a)
{
return a*2;
}

int multi3(int a)
{
return a*3;
}

void main()
{
char ch;
int i=5;
int (*pf)(int a);

printf("5를 두 배 하고 싶으면 2, 세 배 하고 싶으면 3을 누르시오.\n");
ch=getch();

if (ch=='2') {
     pf=multi2;
} else {
     pf=multi3;
}

printf("결과는 %d입니다.\n",(*pf)(i));
}
[/code]

예제가 짧고 간단하기 때문에 함수 포인터에 값을 대입하는 조건을 함수 호출문에 바로 사용할 수 있다. 그러나 다음과 같은 경우에는 함수 포인터를 사용하는 것이 더 좋다.
선택해야 할 함수가 두 개 이상인 경우, 예를 들어 수십개의 함수중 하나를 호출해야 한다면 함수 포인터 배열을 선언하고 그 첨자를 선택하는 것이 더 쉽다.
함수를 선택하는 시점과 실제로 호출하는 시점이 완전히 분리되어 있는 경우도 함수 포인터를 쓰는 것이 유리하다. 호출할 함수에 대한 조건 점검은 필요할 때 한번만 하고 선택된 함수는 별다른 조건 점검없이 함수 포인터로 바로 호출할 수 있다.
호출할 함수가 DLL같은 외부 모듈에 있고 이 함수를 동적으로 연결할 경우는 컴파일할 때 함수의 존재가 알려지지 않으므로 반드시 함수 포인터를 사용해야 한다. 함수 포인터를 사용하면 이름으로부터 원하는 함수의 번지를 찾아 호출할 수 있다.

함수 포인터를 반드시 사용해야 하는 예는 아주 많다. 대표적으로 개방된 데이터 베이스 환경인 ODBC를 들 수 있는데 ODBC는 다양한 데이터 베이스 서버를 일관된 방법으로 다룰 수 있는 표준 인터페이스를 제공한다. 언제든지 드라이버를 바꾸기만 하면 ODBC 표준을 따르는 모든 데이터 베이스 서버를 액세스할 수 있다. 각 드라이버는 ODBC 규약에 따라 미리 정해진 함수의 집합을 구현하며 ODBC 관리자는 응용 프로그램의 요구에 따라 드라이버의 함수를 찾아 호출해 주는데 이때 드라이버내의 함수 번지를 저장하기 위해 함수 포인터 배열이 사용된다.

'Native > C' 카테고리의 다른 글

Quick sort (퀵소트)  (0) 2013.10.02
함수 포인터 상에서의 캐스트 연산자  (0) 2013.10.02
테트리스  (0) 2013.10.02
turbo.h  (0) 2013.10.02
Matrix Logo  (0) 2013.10.02