기본 카테고리
함수포인터
졸리운_곰
2009. 11. 12. 07:30
| 함수포인터 |
[�렪吏�]
설명 #
"함수포인터"는 C언어에서 자주 쓰이는 기본 용법중 하나입니다. 정의는 다음과 같습니다.
선언된 함수가 저장된 메모리 번지값을 담고 있는 포인터 변수하지만 이것을 왜 보통의 포인터와는 달리 특별취급하냐면 다음과 같은 이유 때문입니다.
- 일반 포인터 변수와는 조금 다르게 보이는 문법으로 선언됩니다. 예를 들어 함수 포인터 변수는 다음과 같이 선언합니다. (functionPtr이 포인터 변수명이 됩니다)
void (*functionPtr)(const char *s_)
- 함수포인터는 실행부분을 가리키는 포인터 변수인탓에 () 연산자를 사용할 수 있습니다. 즉, 위의 functionPtr은 아래와 같이 실행가능합니다.
functionPtr("바보나라~")
[�렪吏�]
예제 #
아래 예제는 함수포인터를 활용한 간단한 예제입니다.
#include <stdio.h>void testout1(const char *s) { printf("시험출력1:%s\n", s);}void testout2(const char *s) { printf("시험출력2:%s\n", s);}// 함수포인터 변수void (*funcPtr)(const char *s);int main() { // 함수포인터를 testout1, testout2로 각각 대입해보고 실행해본다. funcPtr = testout1; funcPtr("테스트"); funcPtr = testout2; funcPtr("테스트");}실행결과는 아래와 같습니다.
시험출력1:테스트시험출력2:테스트main()안에서는 funcPtr만 실행했지만 마치 testout1, testout2를 각각 실행한 것과 같은 효과가 있음을 알 수 있습니다.
[�렪吏�]
typedef 거는 법 #
함수포인터를 어떤 포인터 변수로서 활용하고 싶을 때 typedef를 활용하면 매우 편리합니다. 실제로 win32 API에서는 윈도우 프로시저 함수포인터형으로 WNDPROC라는 타입이 있습니다. (이부분을 보면 어느정도 사용법에 대한 느낌이 올겁니다) winuser.h 헤더화일에서 검색해보면 다음과 같이 선언되어있습니다.
typedef LRESULT(CALLBACK *WNDPROC)(HWND,UINT,WPARAM,LPARAM);
실제로 사용될 때에는 다음과 같이 사용됩니다.
LRESULT CALLBACK winproc1(HWND,UINT,WPARAM,LPARAM) { };...WNDPROC winprocPtr = winproc1;...꽤 유용한 문법이니 알아두시면 좋습니다.