Function Pointer
함수 포인터: 함수를 가리키는 포인터 변수
*
: Pointer /[]
: Array /()
: Function 으로 생각
Example
void func(int a, int b) { ... } // 정의
...
int main()
{
void (*p)(int, int); // 함수 포인터 변수
p = func;
p(1, 2);
return 0;
}
Usage 1-1
함수는 매개변수를 전달 받고 다음 함수로 전달하는 경우가 있는데
그럴때, 함수 포인터를 매개변수로 전달 받을 수 있고, 유기적인 함수의 선택이 가능하다.qsort
(퀵소트, 퀵정렬)함수와 같은 경우 compare
함수를 매개변수로 전달 받는데,
이때 사용자는 해당 함수만 수정하여 기능을 변경 할 수 있다.
Usage 1-2
이벤트 핸들러로 사용 될 경우, 특정 이벤트가 발생시에 어떤 동작을 하는 함수가 있다면,
하나의 함수에서 각각의 다른 이벤트를 함수 포인터로 전달 받아서 실행 할 수 있게 된다.
예시로 void eventHander(void (*handler))
라는 함수가 있다면 handler
에 원하는 event
종류를 골라 넣을 수 있게 된다.
또한 include
를 통해 불러온 라이브러리 함수에 현재 파일에서 작성된 함수를 매개변수로 넘겨주어 실행할 수 있다.
= include
는 선언부만 복사 해오기 때문에 실제 함수는 해당 오브젝트(.o
) 파일로 jump
하여서 실행
(이런식으로 연결 시켜주는게 Linking
이라고 부름)
Usage 2
System 부팅 시에 Bootloader에서 Application을 넘어갈 경우에 사용
Bootloader의 실행 위치는 이미 정해저 있고 부팅시에 우선적으로 시작된다.
그 후 Bootloader는 Application을 실행하기 위해 0x0000_1000
를 참조하는데,
Application의 시작 함수(Entry Point)(= void app main(void)
)의 주소를 저장해두어야한다,
여기서 해당 함수의 주소, 즉 함수 포인터가 쓰이게 되는 것 이다.