[[프로그래밍_NOTE]]/C , C++

함수 포인터 연습

갑빠돌격기 2008. 8. 25. 12:50

// [[ 1 ]] ///////////////////////////////////////////
// 사용자 입력에 따라 선택적으로 함수를 호출할 수 있다.
////////////////////////////////////////////////////
#include<stdio.h>

void foo()
{ printf("foo\n"); }
void goo()
{ printf("goo\n"); }

void main()
{
 void (*p[2])() = {foo,goo};

 int iChoice;
 scanf("%d",&iChoice);fflush(stdin);
 
 switch(iChoice)
 {
 case 0:
  p[0]();
  break;
 case 1:
  p[1]();
  break;
 }
}

// [[ 2 ]] //////////////////////////////
// 함수의 포인터를 인자로 넘기기
///////////////////////////////////////
#include<stdio.h>

void foo(){   printf("foo\n"); }
void goo( void (*p)() )
{
    p();   
    printf("goo\n");
}

void main()
{
   goo(foo);
}

// [[ 3 ]] //////////////////////////////
// typedef 문으로 이용하기
///////////////////////////////////////

#include<stdio.h>

typedef void (*FP1)();

void main()
{
 FP1 p= main;
 printf("%x\n" , main);
 printf("%x\n" , p);
}

// [[ 4 ]] //////////////////////////////
// 추가적으로 생각해 보자.
///////////////////////////////////////

///////////////////////////////////////
#include<stdio.h>

void foo(void){ printf("foo called\n");}
void goo(void){ printf("goo called\n");}

int main()
{
 //C의 문법젹 규칙때문에 아래와 같은 절차를 거친다.
 //void (void) *p = foo;
 //void *p void = foo;
 //void (*p)(void) = foo;
/*
 void (*p)(void) = foo;
 p();
*/
 void (* p[] )(void) = {foo,goo};
 for(int i=0 ; i<2; i++)
  p[i]();
 return 0;
}

///////////////////////////////////////
#include<stdio.h>

void foo(void){ printf("foo called\n");}
void goo(void){ printf("goo called\n");}

int main()
{
 int choice;
 void (* p[] )(void) = {foo,goo};
 
 printf("input number : ");
 scanf("%d",&choice);fflush(stdin);
 
 switch(choice)
 {
 case 0:
  p[0]();
  break;
 case 1:
  p[1]();
  break;
 }
}

///////////////////////////////////////
#include<stdio.h>

void foo(void){ printf("foo called\n");}
void goo(void (*p)(void))
{
 p();
 printf("goo called\n");
}

int main()
{
 goo(foo);
 return 0;
}

///////////////////////////////////////
#include<stdio.h>

void foo(void){ printf("foo called\n");}
void goo(void (*p)(void))
{
 p();
 printf("goo called\n");
}
void wow(void){ printf("wow called\n");}

int main()
{
 goo(wow);
 return 0;
}

///////////////////////////////////////
#include<stdio.h>

void foo(void){ printf("foo called\n");}

//void (*) (void) goo(void) 를 C의 문법으로 고친다.
void( *goo(void) )(void)
{
 printf("goo called\n");
 return foo;                 //void 함수 이지만 리턴값을 가지고 있다.
}
int main()
{
 goo()();
 return 0;
}


///////////////////////////////////////
#include<stdio.h>

void foo(void)
{
 printf("foo called\n");
}

void( * goo(  void(*p)( void )  ))(void)
{
 p();
 printf("goo called\n");
 return foo;
}
int main()
{
 goo(foo)();
 return 0;
}

#endif


//////////////////////////////////////////////////////////////////////////
//    MSDN에서 signal함수 원형을 분석해 보라.     //
//////////////////////////////////////////////////////////////////////////

#include <stdio.h>

void foo( void ){ printf("foo called\n");}

void(* goo(   void (*p)( void )   )  )(void)
{
 p();
 printf("goo called\n");
 return foo;
}

int main()
{
 void(* (*p[][2])(   void (*)()   )  )() = {{goo,goo}};

 void(* (*(*q)[2])(   void (*)()   )  )() = p;

 q[0][0](foo)();
 return 0;
}

///////////////////////////////////////
#include <stdio.h>

typedef void (*FP1)( void );
typedef FP1 (*FP2)( FP1);
typedef FP2 (*FP3)[2];

void foo( void )
{
 printf("foo called\n");
}

FP1 goo(   FP1 p   )
{
 p();
 printf("goo called\n");
 return foo;
}

int main()
{
 FP2 p[][2] = {{goo,goo}};
 
 FP3 q = p;
 
 q[0][0](foo)();
 return 0;
}