// [[ 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;
}