jam 블로그

[C] 19. 함수포인터와 void 포인터 본문

개발 및 관련 자료/C

[C] 19. 함수포인터와 void 포인터

kid1412 2013. 5. 12. 19:46
728x90

I. 함수 포인터

  • 함수 포인터란 무엇인가?

    • 함수의 이름은 메모리상에 존재하는 함수의 위치를 기리키는 포인터.
  • 함수 포인터의 포인터 타입은 어떻게 되는가?

    • 함수 이름의 포인터 타입을 결정짓는 요수는 리턴형과 전달인자이다.
  1. double fct2(doubel a, double b)
  2. {
  3. double add = a+b;
  4. return add;
  5. }
  •  위와 같은 함수가 있다면 리턴형은 double 이고 double 형 인자를 두 개 전달받는 포인터 타입이다. 라고 말 할 수 있다.

 

  • 적절한 함수 포인터의 선언
  1. int(*fPtr1)(int);
  •  위와 같은 형태로 리턴형(*함수명)(인자값) 이런식으로 쓰면 된다.
  1. #include <stdio.h>
  2. void Add(int a, int b);
    void SPrint(char *str1);
  3. int main()
    {
     char *string = "Function Pointer";
     int a= 10,b=20;
  4.  void (*fPtr1)(int,int ) = Add;
     void (*fPtr2)(char*) = SPrint;
  5.  fPtr1(a,b);
     fPtr2(string);
  6.  return 0;
    }
  7. void Add(int a, int b)
    {
     printf("a + b : %d\n",a+b);
    }
  8. void SPrint(char *str1)
    {
     printf("문자열 ; %s\n",str1);
    }
  • 위의 소스에서 보면 void (*fPtr1)(int,int) = Add라고 써있는데 리턴값이 void이고, int형 인자를 2개 받는 fPtr1함수를 Add라고 정의 한다는 것이다

    • Add는 함수명이니 fPtr1 은 Add 함수와 같다고 보면 되는 것이다.
  1.  #include <stdio.h>
  2. void SelFunction(int s);
    void Add(void);
    void Min(void);
  3. int main()
    {
     int sel;
  4.  while(1)
     {
      printf("선택 : 덧셈(1),뺄셈(2),종료(3)");
      scanf("%d",&sel);
      if (sel == 3)
       break;
      SelFunction(sel);
     }
     printf("프로그램 종료되었습니다. \n");

  5.  return 0;
    }
  6. void SelFunction(int s)
    {
     void(*fPtr)(void);
     if (s==1)
      fPtr = Add;
     else
      fPtr = Min;
     fPtr();
    }
  7. void Add(void)
    {
     int a,b;
     printf("덧셈할 두 수 넣어라:");
     scanf("%d %d",&a,&b);
     printf("덧셈 결과 : %d\n",a+b);
    }
    void Min(void)
    {
     int a,b;
     printf("뺄셈할 두수를 넣어라:");
     scanf("%d %d",&a,&b);
     printf("뺄셈 결과 : %d\n",a-b);
    }
  •  위의 소스를 보면서 함수포인터를 생각핼 보면 쉬울 것이다.

 

II. void형 포인터

  • void형 포인터는 어떤 형태든 담을수 있는 포인터 이다.

    • 단점은 void 포인터를 가지고는 아무런 일을 하지 못하기 때문이다.
    • void형 포인터는 일단 주소 값을 저장해 두고, 포인터의타입은나중에 결정 하는 식이어서 메모리 동적 할당때 유용하게 쓰인다.
  1. int n =10;
  2. void *vp = &n;
  3. *((int*)vp) = 20;
  • 두번째 줄은 void형 포인터 선언 및 초기화를 한 것이고, 세번째 줄은 20으로 변경하기 위해서 int형으로 형변환하고 있는 것이다.

 

III. main 함수도 인자를 받을 줄 알아요.

  • main 함수를 통한 인자의 전달
  1. #include <stdio.h>
  2. int main(int argc, char *argv[])
    {
     int i=0;
     printf("전달된 문자열의 수 : %d\n",argc);
     for (i=0;i<argc;i++)
     {
      printf("%d번째 문자열 : %s\n",i+1,argv[i]);
     }
     return 0;
    }
  •  인자의 형성 과정

    • 위의 소스에 대한 설명이다.

      • 예를 들어 C:\main\main.exe 123 kkk 이렇게 실행을 시켰다고 보자.
      • 그럼 위에 실행 시킨 것이 어떻게 되는지 그림으로 보자.
      •  20.jpg
      • 위 처럼 저장이 된다. 따라서 argc는 3이고, argv 배열에 들어가 있는 것은 위와 같다.
      • 참고로 *argv[] 이렇게 썼었는데 **argv와 동일하다. 
Comments