2010. 9. 3. 14:13
함수 포인터 선언!
int (*fPtr1)(int);
: 함수포인터 fPtr1은 리턴형이 int이고 int형 인자 1개를 전달받는 모든 함수를 가리킬 수 있는 포인터가 된다.
void (*fPtr2)(int, int);
: 함수포인터 fPtr2는 리턴형이 void이고 int형 인자 2개를 전달 받는 모든 함수를 가리킬 수 있는 포인터가 된다.

 #include <stdio.h>

void Add(int a, int b);
void Sprint(char *str);
int main(void){
 char *string = "Function Pointer";
 int a=10, b=20;

 void (*fPtr1)(int, int) = Add;
 void (*fPtr2)(char*) = Sprint;

 fPtr1(a, b);
 fPtr2(string);

 return 0;
}

void Add(int a, int b)
{
 printf("덧셈 결과 : %d\n", a+b);
}
void Sprint(char *str)
{
 printf("입력된 문자열: %s\n", str);

}






포인터 배열과 같이 '함수 포인터를 원소로 갖는 함수 포인터 배열'을 생각할 수 있다.
다음은 배열의 크기가 4인 함수 포인터 배열을 선언하는 문장으로 배열의 각 원소가 가리키는 함수는 반환값이 void이고 인자목록이 (double*, double, double)이어야 한다.

    void (*pfary[4]) (double*, double, double)

위에서 선언된  배열에 함수 4개의 주소값을 저장하는 문장은 다음과 같다.
   
    pfary[0] = add;
    pfary[1] = subtract;
    pfary[2] = multply;
    pfary[3] = devide;

또는 간단하게 배열의 선언화 초기화 문장으로 처리할 수 있다.
   
    void (*pfary[4]) (double*, double, double) = {add, subtract, multiply, devide};

위의 것들을 사용하여 간단한 사칙연산 예제 프로그램을 작성해 보자.

 예제 10-17   출처 : C로 배우는 프로글밍 기초 p.327

 /*
   파일 : pfunarray.c
   목적 : 함수 포인터 배열을 이해하기 위한 예제
*/
#include <stdio.h>

void add(double*, double, double);
void subtract(double*, double, double);
void multiply(double*, double, double);
void devide(double*, double, double);

int main(void)
{
 double m, n, result;
 int opmenu;
 char *opstr[4] = {"더하기", "빼기", "곱하기", "나누기"};
 char op[4] = {'+', '-', '*', '/'};

 void (*pfary[4])(double*, double, double) = {add, subtract, multiply, devide};

 printf("사칙연산을 위하여 각 연산에 대한 번호를 입력하세요. >> \n");
 printf("[더하기] : 0, [빼기] : 1, [곱하기] : 2, [나누기] : 3 >> ");
 scanf("%d", &opmenu);
 if( !(0 <= opmenu && opmenu <= 3) )
 {
  printf("메뉴 입력이 잘못되어 프로그램을 종료합니다.\n");
  return 0;
 }

 printf("\n사칙연산을 수행할 실수 2개를 입력하세요. >> ");
 scanf("%lf %lf", &m, &n);

 //사칙연산을 배열의 첨자를 이용하여 수행
 pfary[opmenu](&result, m, n);
 printf("\n문장  : pfary[%d] 함수 호출\n", opmenu);
 printf("%s 수행 : %lf %c %lf == %lf\n\n", opstr[opmenu], m, op[opmenu], n, result);

 return 0;
}

void add(double *z, double x, double y)
{
 *z = x + y;
}
void subtract(double *z, double x, double y)
{
 *z = x - y;
}
void multiply(double *z, double x, double y)
{
 *z = x*y;
}
void devide(double *z, double x, double y)
{
 *z = x/y;
}



[+@  if문을 while문으로 고쳐서, 사용자가 임의로 종류하기 전까지 반복하는 식으로 변경해 보자.]
[      잘못된 수를 썼을 경우, 다시 입력하라는 문구가 뜨게 하자.]
Posted by Triany