19. 함수포인터와 void 포인터

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와 동일하다. 

이 글은 스프링노트에서 작성되었습니다.

'2. C/C++ > 01. C' 카테고리의 다른 글

22. 구조체와 사용자 정의 자료형1  (0) 2008.12.07
21. 문자와 문자열 처리 함수  (0) 2008.12.07
18. 다차원 배열 그리고 포인터  (0) 2008.12.07
17. 포인터의 포인터  (0) 2008.12.07
16. 다차원 배열  (0) 2008.12.07
Posted by kid1412
,