책에서 기본적으로 배우는 함수포인터는 다음과 같다.

 

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

+ Recent posts