i0nucleus.egloos.com

ZeroNucleus - Programmer


Twitter_FM

All_Blog_AD

English

Yahoo Blog Rank

야후 블로그 벳지


[C/C++] 함수 포인터, [내용 추가 (2009.1.5)]

[C/C++] 함수 포인터

일반 C/C++ 프로그래밍을 할 때 함수 포인터로 직접 지정해서 사용해 본 적이 없네요.
기초 서적을 참고하다가 이와 같은 것이 있었습니다. (공부했습니다...)

보통 일반적으로 함수를 만들어서 그냥 호출하여 사용을 합니다.(간단한 예제 정도 수준의 프로그래밍 에서..)

[Source Code 1]

int Sum(int a, int b)
{
     return a+b;
}

int _tmain(int argc, _TCHAR* argv[])
{
     int c;

     c = Sum(5, 3);
     printf("%d", c);
 
     return 0;
}



다음 예제는 함수 포인터 변수를 선언해서, Sum()시작주소를 넘겨주고 호출합니다.

[Source Code 2]

int Sum(int a, int b)
{
     return a+b;
}

int _tmain(int argc, _TCHAR* argv[])
{
     int c;
     int (*fp)(int, int);                 // 함수 포인터 변수, fp둘러싼 괄호는 반드시 명시해야 함.

     fp = Sum;                          // Sum() 함수의 시작 주소를 fp에 대입
 
     c = fp(5, 3);
     printf("%d", c);
 
     return 0;
}


[Source Code 1], [Source Code 2] 결과는 같아요.


[-----내용 추가 (2009.1.1)-----]
함수 포인터에 대해서 내용을 추가하였습니다. 새로운 코드를 직접 작성하여 내용추가했습니다.
함수 포인터 설정, 재귀함수, 랜덤 사용법 을 응용하였습니다.

상황에 따라 다른 함수를 호출하기 위해서 함수에 대한 포인터를 사용.

랜덤으로 100개의 수를  입력받아서, 각각의 수를 카운터하여 배열에 저장.
사용자 입력을 받아서 * 또는 #으로 출력. 이 때 출력할 때 함수로 출력, 재귀함수 사용.

[Source Code 3]

#include <stdio.h>
#include <stdlib.h>                           // rand 함수 사용을 위해서... 
#include <time.h>                            // time 함수 사용하기 위해서...

void Recur_Prn_Star(int);                   // * 출력 함수 선언. Recursive Function
void Func_Prn_Sharp(int);                  // # 출력

void main()
{
     char Cnt[10] = {0, };                     // Cnt 배열 10개. (0 초기화)
     int num;

     void (*ptr)(int);

     srand((unsigned int)time(NULL));                             // rand
     for(int In_Cnt = 1; In_Cnt <= 100; In_Cnt++) ++Cnt[rand() % 10];

     printf("Enter a number between 1 and 2, 1(*), 2(#) ");
     scanf_s("%d", &num);                               // 입력을 받음 (*, # 출력 위해서)

     switch(num)
     {
      case 1:
          ptr = Recur_Prn_Star;                           // ----------
          break;
      case 2:
          ptr = Func_Prn_Sharp;                         // ----------
          break;
      default:
          return;
     }

     for(int i = 0; i < 10; i++)                               // 10번 루프.. for문사용.
     {
          printf("%2d Count = %2d |", i+1, Cnt[i]);     
          ptr(Cnt[i]);                                          // 해당 함수 호출.
          putchar('\n');                                     // 한줄 내리는 코드.
     }
}
  
void Recur_Prn_Star(int n)                           // Recursive Function 사용 출력.
{                                                              // n개만큼 * 출력.
     if(n > 0)                                               // n > 0 이경우 (if문)
     {
          putchar('*');                                    // * 출력. 
          Recur_Prn_Star(n-1);                        // n-1을 하여 재귀함수 호출....
     }
     return ;                 
}

void Func_Prn_Sharp(int n)
{
     for(int i=0; i<n; i++) putchar('#');
}

[Result 3]

















[-----내용 추가 (2009.1.5)-----]
함수 포인터 배열, 아래 코드 참조.
pfArr[0] = add;
pfArr[1] = subtract;
    :
아래 코드는 3개의 함수포인터 배열을 사용한 예제입니다.

[Source Code 4]

#include <stdio.h>

void add(int *re, int x, int y)
{
     *re = x + y;
}

void subtract(int *re, int x, int y)
{
     *re = x - y;
}

void multiply(int *re, int x, int y)
{
     *re = x * y;
}

void main(void)
{
     int Result;

     void (*pfArr[3]) (int *, int, int) = {add, subtract, multiply}; // 함수포인터 배열 선언

     pfArr[0] (&Result, 5, 3);
     printf("pfArr[0] %d (add)\n", Result);
     pfArr[1] (&Result, 5, 3);
     printf("pfArr[1] %d (subtract)\n", Result);
     pfArr[2] (&Result, 5, 3);
     printf("pfArr[2] %d (multiply)\n", Result);
}

[Result 4]
pfArr[0] 8 (add)
pfArr[1] 2 (subtract)
pfArr[2] 15 (multiply)
계속하려면 아무 키나 누르십시오 . . .