프로그램 내에 정의된 다양한 함수들도 바이너리 형태로 메모리에 저장되어 호출시 실행된다. 이런 함수들의 주소도 포인터 변수에 저장할 수 있다. 배열의 이름이 배열의 시작 주소를 가리키듯, 함수의 이름도 함수가 저장된 메모리 주솟값을 나타낸다.
int SimpleFunc(int num) { ... }
위 함수의 반환형은 int 이고, 매개변수는 int num 이다. 함수의 이름 SimpleFunc는 함수의 주솟값을 의미하는 상수형태의 함수 포인터 이다. 이 함수의 포인터 형은 반환형이 int이고, 매개변수로 int형 변수가 하나 선언된 포인터형 이다.
포인터 변수의 선언은 다음과 같다.
int (*fptr) (int)
반환형이 int이며, 매개변수 선언이 int 하나인 함수 포인터 변수이다.
다음과 같은 함수의 경우 아래와 같이 함수 포인터 변수를 선언한다.
int Func(int num1, int num2) { ... }
int (*fptr) (int, int);
그리고 다음과 같은 방식으로 Func 함수를 호출할 수 있다.
fptr(2,5);
다음 코드는 함수 포인터 변수를 활용한 예시이다.
#include <stdio.h>
void SimpleAdder(int n1, int n2)
{
printf("%d + %d = %d\n", n1, n2, n1+n2);
}
void ShowString(char * str)
{
printf("%s\n", str);
}
int main(void)
{
char *str = "Function Pointer";
int num1 = 10, num2 = 20;
void(*fptr1)(int, int) = SimpleAdder;
void(*fptr2)(char *) = ShowString;
fptr1(num1, num2);
fptr2(str);
return 0;
}
/* output :
10 + 20 = 30
Function Pointer
*/
#include <stdio.h>
int WhoIsFirst(int age1, int age2, int (*cmp)(int n1, int n2))
{
return cmp(age1, age2);
}
int OlderFirst(int age1, int age2)
{
if(age1 > age2)
return age1;
else if(age2 > age1)
return age2;
else
return 0;
}
int YoungerFirst(int age1, int age2)
{
if(age1<age2)
return age1;
else if(age2<age1)
return age2;
else
return 0;
}
int main(void)
{
int age1 = 20, age2 = 30;
int first;
printf("입장순서 1 \n");
first = WhoIsFirst(age1, age2, OlderFirst);
printf("%d세와 %d세중 %d세가 먼저 입장\n", age1, age2, first);
printf("입장순서 2 \n");
first = WhoIsFirst(age1, age2, YoungerFirst);
printf("%d세와 %d세중 %d세가 먼저 입장\n", age1, age2, first);
return 0;
}
/* output :
입장순서 1
20세와 30세중 30세가 먼저 입장
입장순서 2
20세와 30세중 20세가 먼저 입장
*/
위 코드와 같이 함수의 매개변수로 함수 포인터 변수를 넣을 수 도 있다.
'Language > C, C++' 카테고리의 다른 글
[C] main 함수로의 인자 전달 (0) | 2021.01.09 |
---|---|
[C] void 포인터 (0) | 2021.01.08 |
[C] 2차원 배열의 포인터 (0) | 2020.12.30 |
[C] 삼중 포인터 (0) | 2020.12.28 |
[C] 더블 포인터 (0) | 2020.12.28 |