과제 printf를 반환하는 test()

test()
{
     return printf;
}

반환형은 무엇일까? 함수포인형?

test()함수에서 printf를 반환하고 있습니다 printf를 반환하기 위해서는 test()함수를 printf형으로 만들어 보겠습니다

우선 printf형은 linux에서 man 3 printf를 해본결과

int printf(const char*,...); // int (*)(const char*,...);
것을 알수있습니다 여기에 test()함수를 넣어..바꾸면

int(*test(void))(const char*,...)
test() = printf를 반환하는 함수가 됩니다

추가로 포인터 변수를 선언하여 역시 printf와 같은 역활을 하도록 만들어 보겠습니다
위의 printf형에 포인터변수 fp를 대입하면
int(*fp)(const char*,...) = 0 //0으로 초기화

위의 2가지를 넣어서 test()에서 printf를 반환하게 하고 또한 printf를 포인터변수로 사용해서 프로그램을 작성하면
이렇게 됩니다
#include <stdio.h>

int(*test(void))(const char*,...);
int main()
{
  
  int(*fp)(const char*,...) = 0;  //포인터 변수 fp
  
  fp = printf;

  fp("하이 fp로 출력\n");

  test()("하이 test()로 출력\n");
  return 0;
}

int(*test(void))(const char*,...)
{
  return printf;
}


과제2 -test()을 반환하는 test2
test()
{
   return printf;
}
test2()
{
   return test();
}

 

test()을 반환하는 test2()를 만들어보겠습니다
일단 test()의 print 반환형은 아래와 같습니다
int(*test(void))(const char*,...)

printf처럼 test2()역시 test()의 형태로 맞게 쓰면됩니다

* 뒤로 test2(void)를 넣어주면 test()반환할수있는 test2()가 됩니다
int (*   (*test2(void))(void))      (const char*,...)

그럼 여기에 추가로 test2()를 반환하는 test3()는 이렇게 됩니다
int (*   (*   (*test3(void))(void))(void))(const char*,...)

위 함수를 바탕으로 printf대신 fp test() test2() test3()을 사용하는 프로그램을 작성하면 다음과 같습니다
#include <stdio.h>

int(*test(void))(const char*,...);
int (*(*test2(void))(void))(const char*,...);
int (*(*(*test3(void))(void))(void))(const char*,...);

int main()
{
  int(*fp)(const char*,...) = 0;  //포인터 변수 fp
  
  fp = printf;

  fp("하이 fp로 출력\n");
  test()("하이 test()로 출력\n");
  test2()()("하이 test2()()로 출력\n");
  test3()()()("하이 test3()()()로 출력\n");
  
  return 0;
}

int(*test(void))(const char*,...)
{
  return printf;
}

int (*(*test2(void))(void))(const char*,...)
{
  return test;
}

int (*(*(*test3(void))(void))(void))(const char*,...)
{
  return test2;
}


과제3 빈칸을 채워 올바르게 동작하도록 하시오

#include <stdio.h>

//test1 선언(인수 1, float f)

//test2 선언(인수 1, char c)

 

int main()

{

  int (*fp)(const char *, ...)=0;

  //fp1 선언

  //fp2 선언

 

  fp2 = test2;

  fp1 = fp2('a');

  fp  = fp1(0.1);

 

  fp("Hi....\n");

  return 0;

}

 

//test1 정의(인수 1, float f)

{

  printf("float : %0.1f\n", f);

  return printf;

}

 

//test2 정의(인수 1, char c)

{

  printf("char : %c\n", c);

  return test1;

}


test1과 test2의 반환형에 맞게 수정하고 포인터변수를 선언해주면 됩니다

먼저 test1은 인자에 float형이 들어갑니다
test1(float f)에 printf로 반환하게되니
int (*test1(float f))(const char*,...)

가 됩니다 test2는 복잡하지만 마찬가지입니다 test는 char형입니다

test2(char c)에 test로 반환되니 *중심으로 앞뒤를 붙혀주면 됩니다
int (*(*  +  test2(char c)   +    ))(float f))(const char*,...)
=int (*(*test2(char c))(float f))(const char*,...)

여기에 포인트변수 fp1은 0.1 float형이고 fp2는 'a' 문자입력을 받습니다
int(*(*   +  fp1   +    )(float))(const char*,...)=0;
int(*(*(* +   fp2   + )(char))(float))(const char*,...)=0;

위의 내용을 참고하여 프로그램을 작성하면...
#include <stdio.h>

int (*test1(float f))(const char*,...);
int (*(*test2(char c))(float f))(const char*,...);

int main()
{
  int (*fp)(const char *,...) = 0;

  int(*(*fp1)(float))(const char*,...)=0;
  int(*(*(*fp2)(char))(float))(const char*,...)=0;
     
  fp2 = test2;
  fp1 = fp2('a');
  fp = fp1(0.1);

  fp("Hi....\n");
  return 0;
}

int (*test1(float f))(const char*,...)
{
  printf("float : %0.1f\n", f);
  return printf;  
}
  
int (*(*test2(char c))(float f))(const char*,...)
{
  printf("char : %c\n", c);
  return test1;
}

Posted by mantwo