함수포인터

2009.11.12 07:27

가을의 곰을... 조회 수:7399

경축! 아무것도 안하여 에스천사게임즈가 새로운 모습으로 재오픈 하였습니다.
어린이용이며, 설치가 필요없는 브라우저 게임입니다.
https://s1004games.com

함수포인터


설명 #

"함수포인터"는 C언어에서 자주 쓰이는 기본 용법중 하나입니다. 정의는 다음과 같습니다.
선언된 함수가 저장된 메모리 번지값을 담고 있는 포인터 변수
하지만 이것을 왜 보통의 포인터와는 달리 특별취급하냐면 다음과 같은 이유 때문입니다.
  1. 일반 포인터 변수와는 조금 다르게 보이는 문법으로 선언됩니다. 예를 들어 함수 포인터 변수는 다음과 같이 선언합니다. (functionPtr이 포인터 변수명이 됩니다)
    void (*functionPtr)(const char *s_)
    
  2. 함수포인터는 실행부분을 가리키는 포인터 변수인탓에 () 연산자를 사용할 수 있습니다. 즉, 위의 functionPtr은 아래와 같이 실행가능합니다.
    functionPtr("바보나라~")
    


주로 함수포인터는 콜백(callback)을 구현하는데 사용됩니다. 어떤 라이브러리를 제작할 때 개발자가 어떤 "경우"에 대한 반응을 함수로 작성하고 이를 다시 라이브러리에서 호출하도록 작성하고자 할 때, 개발자가 작성한 함수의 포인터를 넘겨받아 실행하도록 하면 아주 유용할 때가 많습니다. (대표적인 예가 win32 api에서 윈도우 프로시져를 WNDCLASS의 lpfnWndProc맴버에 등록하는 부분을 들 수 있습니다) 즉, 함수를 마치 변수와 같이 취급하는 것이 가능해집니다.

예제 #

아래 예제는 함수포인터를 활용한 간단한 예제입니다.

#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;
...
꽤 유용한 문법이니 알아두시면 좋습니다.

주의사항 #

함수포인터는 알아두면 상당히 유용한 기법이지만 사용시에는 다음과 같은 부분을 주의해야합니다.
  1. 대입되지 않은 (NULL값상태의) 함수포인터를 실행하지 않도록 주의해야합니다. 초기화를 항상 NULL로 해두고 실행전에 검사하는 것도 좋은 방법입니다.
  2. "같은 함수 포인터 타입"이라는 것을 증명하려면, 반환값, 매개변수의 타입 및 개수가 모두 일치해야합니다. 보통 하나라도 다른 함수포인터값을 대입하면 컴파일시 오류가 나게 됩니다.
본 웹사이트는 광고를 포함하고 있습니다.
광고 클릭에서 발생하는 수익금은 모두 웹사이트 서버의 유지 및 관리, 그리고 기술 콘텐츠 향상을 위해 쓰여집니다.
번호 제목 글쓴이 날짜 조회 수
15 데이터센터 패브릭의 진화와 나아가야할 방향 file 졸리운_곰 2019.02.27 308
14 가트너, 2019년 10대 전략 기술 트렌드 발표 file 졸리운_곰 2019.02.23 219
13 방송대 프라임칼리지가전하는 미래 유망 직업 file 졸리운_곰 2019.01.28 257
12 [김진호 교수의 재미있는 통계] (42) 헷갈려하는 퍼센트 포인트 졸리운_곰 2018.06.08 275
11 [주간조선] 가상화폐는 시작일 뿐, 블록체인 3.0 시대가 오면… file 졸리운_곰 2018.01.28 223
10 2018년 전자정부 10대 기술트렌드 살펴보니 file 졸리운_곰 2018.01.23 275
9 [알아봅시다] 춘천의 한림대 경제학과가 앓고있다는 이 질병 : 자기애성 성격장애 졸리운_곰 2017.08.05 289
8 란체스터 전략(Lanchester strategy)이란? 졸리운_곰 2016.10.08 440
7 [알아봅시다] 아포스티유(Apostille)’가 무엇인가요? file 졸리운_곰 2015.09.08 639
6 [과학 오딧세이] 성냥갑 크기로 접는 종이 배터리 나왔다 file 졸리운_곰 2015.06.13 519
5 幽靈(유령) 잡는 과학자들 file 졸리운_곰 2014.11.13 421
4 반도체업계, 사물인터넷·웨어러블 선점 경쟁 시작 졸리운_곰 2014.10.30 392
3 2014년에 뜰만한 정보통신기술 '베스트 10'…입는 컴퓨터에서 전자지갑까지 가을의 곰을... 2013.12.13 1729
2 고연봉 IT 기술직 가을의 곰을... 2013.11.23 1751
1 가트너(Gartner), 2014년 10대 전략 기술 발표 가을의 곰을... 2013.11.23 3864
대표 김성준 주소 : 경기 용인 분당수지 U타워 등록번호 : 142-07-27414
통신판매업 신고 : 제2012-용인수지-0185호 출판업 신고 : 수지구청 제 123호 개인정보보호최고책임자 : 김성준 sjkim70@stechstar.com
대표전화 : 010-4589-2193 [fax] 02-6280-1294 COPYRIGHT(C) stechstar.com ALL RIGHTS RESERVED