책에서 기본적으로 배우는 함수포인터는 다음과 같다.
int (*fp) (int, int)
이를 활용해서 두 정수를 더하여 결과를 반환하는 add 함수를 간단히 구현하면 아래와 같다.
#include<stdio.h>
int add(int a, int b){
return a + b;
}
int main(){
int (*fp)(int, int);
fp = add;
printf("%d\n", fp(10, 20));
return 0;
}
이를 full pointer type 이라 한다. 하지만 이 함수포인터를 사용할 때 이런식으로 일일히 사용하기 쉽지 않다. 좀 더 편리하게 사용하기 위하여 typedef 를 사용한다.
int add(int a, int b)
{
return a+b;
}
위와 같은 함수가 있다고 하자. 그러면 typedef 을 사용하여 함수포인터 별칭을 만들면 아래와 같다.
typedef int (*FP)(int, int)
별칭으로 정의한 함수포인터를 활용한 코드를 아래에서 보자.
#include <stdio.h>
int add(int a, int b)
{
return a + b;
}
typedef int (*FP)(int, int);
FP getAdd()
{
return add;
}
int main()
{
printf("%d\n", getAdd()(10, 20));
return 0;
}
별칭으로 정의한 함수포인터를 반환하는 getAdd함수를 만들었다. 그리고 메인함수에서 getAdd()(10,20) 이라고 작성 후 실행하면 결과가 30이 나온다.
1 #include<stdio.h>
int add(int a, int b)
{
return a + b;
}
typedef int (*FP)(int, int);
struct Calc
{
FP fp;
};
void exec(FP fp)
{
printf("%d\n", fp(30, 40));
}
int main()
{
FP fp1;
fp1 = add;
printf("%d\n", fp1(10, 20));
FP fp[3];
fp[0] = add;
printf("%d\n", fp[0](20, 30));
struct Calc cal;
cal.fp = add;
printf("%d\n", cal.fp(50, 50));
exec(fp1);
exec(add);
return 0;
}
함수포인터의 추천 명세는 다음과 같다. ( in 모던C)
#include <stdio.h>
int add(int a, int b)
{
return a + b;
}
typedef int pfunc(int, int);
void _exec(pfunc *pf)
{
printf("%d\n", pf(100, 100));
}
int main()
{
_exec(add);
return 0;
}
'C' 카테고리의 다른 글
memset (0) | 2022.08.23 |
---|---|
[Socket] thread (0) | 2022.06.28 |
[Socket] close() (0) | 2022.06.25 |
stack & heap in Visual Studio (0) | 2022.05.25 |
magic debug value (1) | 2022.05.25 |