카메라 개발자 공부방(SW)

[21장] 함수 포인터 본문

Langauge/C

[21장] 함수 포인터

luckmart 2021. 10. 10. 18:55
반응형

다음은 함수 포인터에 대해 공부해보겠습니다.
함수가 익숙하지 않으시다면 사용자 함수 부분을 꼭 복습해주세요.

다음 코드를 보시겠습니다.

#include <stdio.h>

void Print()
{
    printf("%p\n", Print);
}

void Add(int x, int y)
{
   printf("%d+%d=%d\n", x, y, x + y);
}

int main()
{
    printf("%p\n", Print);
    printf("%p\n", Add);
    printf("%p\n", main);
    return 0;
}

// 실행결과
// function address
// function address
// function address

함수의 이름은 그 함수의 시작 주소입니다. 
함수의 이름도 포인터기 때문에 포인터 변수에 저장할 수 있습니다.
함수의 포인터를 저장하기 위해선 함수의 선언을 알아야 됩니다.

void Print()
{
    printf("%p\n", Print);
}

 

의 함수의 선언은 void Print()이고

void Add(int x, int y)
{
   printf("%d+%d=%d\n", x, y, x + y);
}

 

의 함수의 선언은 void Add(int x, int y);입니다.
함수의 선언을 알면 함수 포인터를 선할 수 있습니다.

#include <stdio.h>

void Print()
{
    printf("%p\n", Print);
}

void Add(int x, int y)
{
   printf("%d+%d=%d\n", x, y, x + y);
}

int main()
{
    void (*pPrint)();
    pPrint = Print;
    printf("%p %p %p\n", pPrint, *pPrint, Print);

    void (*pAdd)(int, int)
    pAdd = Add;
    printf("%p %p %p\n", pAdd, *pAdd, Add);

    return 0;
}

// 실행결과
// 000F129E 000F129E 000F129E
// 000F13A2 000F13A2 000F13A2

 

여기서 결과를 보시면 이상한 부분이 하나 있는데, 함수 포인터에 *를 붙여도 그대로 주소인 것을 알 수 있습니다.
변수 때는 메모리 그 자체가 되었죠?

*연산은 선언된 위치와 사용 용도에 따라서 기능이 달라집니다.
함수 포인터에선 *를 붙이면 그냥 함수의 시작주소를 의미합니다.

자 그 다음은 함수 호출에 대해서 다시 이야기해보겠습니다. 함수 호출은 함수의 이름()라고 이야기했었죠?
함수의 주소()로 함수 호출이 가능합니다.

#include <stdio.h>

void Print()
{
    printf("%p\n", Print);
}

int main()
{
    void (*pPrint)();
    pPrint = Print;
    Print();
    pPrint();
    *pPrint();

    return 0;
}

// 실행결과
// Print
// Print
// Print

 

이 결과가 이해가 되시죠? () 앞에는 함수의 주소가 옵니다.
pPrint, (*pPrint), pPrint든 다 같은 주소 값이기 때문에 동일한 함수가 호출이 되는 것입니다.


그렇다면 함수 포인터는 어느 때에 사용할까요?

1) 함수의 주소를 이용하면 동일한 이름으로 함수를 호출시킬 수 있습니다.(인터페이스 제공)
2) 실행시간에 유저의 정책(함수)을 서버에 쉽게 반영할 수 있는 유연성을 제공합니다.
3) 콜백(CallBack) 메커니즘을 구현할 수 있습니다. 서버 단에서 client 정책을 반영시킬 수 있습니다. 
서버 입장에서는 어떤 코드가 올지 모르는 상황이고 함수 포인터만 받아서 실행시킵니다.

당장에 이해가 안 돼도, 다음에 공부하면 다 알게 됩니다. 
자 오늘은 여기까지

'Langauge > C' 카테고리의 다른 글

[23장] 파일 입출력  (0) 2021.10.12
[22장] 재귀함수  (0) 2021.10.11
[20장] void 포인터  (0) 2021.10.09
[19장] 2차원 배열  (0) 2021.10.08
[18장] 구조체  (0) 2021.10.07
Comments