[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)
계속하려면 아무 키나 누르십시오 . . .





최근 덧글