프로그래밍/C 2013. 4. 19. 00:05

모든 포인터는 메모리 번지를 기억하기 위한 것이다. 함수 또한 메모리의 특정 공간에 존재하며,

그런 이유로 함수 포인터를 사용해서 특정 함수의 시작 번지를 기억할 수 있다.

 

함수 포인터는 함수의 원형(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 함수를 매개 변수로 전달
}


출처 : http://blog.naver.com/PostList.nhn?blogId=eunchol71 

'프로그래밍 > 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
//