모든 포인터는 메모리 번지를 기억하기 위한 것이다. 함수 또한 메모리의 특정 공간에 존재하며,
그런 이유로 함수 포인터를 사용해서 특정 함수의 시작 번지를 기억할 수 있다.
함수 포인터는 함수의 원형(prototype)과 유사하다. 다음과 같이 함수 원형이 있을 때
int my_func( int );
함수 포인터는 다음과 같이 선언한다.
int (*PF) ( int );
둘의 상관 관계를 보면, my_func이 (*PF)로 바뀐 것을 확인할 수 있으며, 여기서 PF가 함수 포인터
변수의 이름이 된다. PF가 변수 이름이므로 다른 이름으로 변경해도 된다. 아래는 왼쪽이 함수의 선언
오른쪽이 그 함수에 대한 함수 포인터의 선언이다.
void f ( void ); -> void (*pf) ( void );
int f ( void ); -> int (*pf) (void );
double f( double ); -> double (*pf) (void);
double f( double, float ); -> double (*pf) (double, float );
...
함수 포인터는 그 길이가 매우 길어질 수 있기 때문에 다음과 같이 재정의해서 사요하는 것이 좋다.
typedef int (*MyFunc) ( int );
typedef은 int (*) (int)형 포인터를 MyFunc라고 재정의한다. 이렇게 정의되면,
int (*PF) ( int );
와
MyFunc PF;
는 동일한 선언이 된다. 특히 함수 포인터를 리턴값으로 사용해야 하는 경우는 반드시 typedef에 의해
재정의한 후 사용해야 한다.
typedef int (*MyFunc) ( int );
int f1( int )
{
return 0;
}
MyFunc func( void )
// int (*)(int) func( void ) 사용할 수 없음
{
return F1;
}
다음은 함수 포인터를 리턴하는 간단한 예이다.
#include <stdio.h>
typedef int (*Func)(int); // int (*)(int) 형 포인터를 Func라고 재정의
int my_func( int a )
{
printf( "%d \n", a );
return 0;
}
void my_func2( int(*myF)(int) ) // 함수의 매개 변수로 전달
{
myF( 2 );
}
void my_func3( Func myF ) // my_func2와 동일
{
myF( 3 );
}
Func get_func( void )
{
return my_func; // my_func함수 포인터를 리턴
}
void main( void )
{
Func myF; // int (*myF) (int); 와 동일, myF는 함수 포인터 변수
myF = get_func(); // 함수 포인터를 리턴 받음
myF( 1 ); // 함수 포인터 변수 myF를 사용하여 my_func 함수 호출, my_func(3)과 동일
my_func2( my_func ); // my_func 함수를 매개 변수로 전달
my_func3( my_func ); // my_func 함수를 매개 변수로 전달
}
'프로그래밍 > C' 카테고리의 다른 글
포인터? 포인터변수? 포인터의 이해 (0) | 2013.04.19 |
---|---|
Double linked list with using array (0) | 2013.04.19 |
linked list [펌] (0) | 2013.04.19 |
Double linked list (0) | 2013.04.19 |
C언어를 굳이 배워야하는이유[펌] (0) | 2013.03.15 |