함수 포인터에 대한 정의 이다.
일반 포인터가 변수에 대한 주소를 가지고, 변수를 가리킬 수 있는것 처럼 함수, 즉 실행가능한 코드를 가리키고 있는 포인터이다.
위키에서의 예시를 먼저 확인 해본다면
함수포인터가 익숙하지 않는 상태에선 이해하기 힘든 코드로 보인다. 그러니 하나씩 뜯어보자.
(실제로 이렇게 쓰는 경우도 있다고 어디서 듣긴했다...)
먼저 함수 선언부를 보자면
int func1(int a);
가장 기본적인, 처음에 배우는 정수형을 리턴하는 함수이다.
int func2(int (*p)(int),int a);
이전의 위키의 예시와 같이 생각하면 된다. 매개변수로 함수 포인터를 받는, 가장 기본적인 응용이라 생각된다.
함수의 내용에서 받은 함수를 호출하여 리턴값을 다시 리턴하는 방법을 활용하였다.
int (*func3(void))(int);
이번엔 리턴값이 함수포인터인 경우이다.
위의 정의식을 그대로 첫번째 int 값에 넣어버리고 싶지만, 컴파일러가 그렇게 읽을 수는 없나보다.
따라서 해당 함수명의 앞에 리턴값이 포인터임을 알리는 *을 붙이고, 괄호로 해당 함수의 마지막까지 감싼다.(괄호를 하지 않으면 int*를 리턴값으로 인식할것이다)
마지막에 리턴하는 함수포인터의 매개변수 형식을 붙여주면 된다.
(위의 식에서 초록 글이 함수명이고, 노란글이 리턴형식이다.)
그냥 보기엔 어려워 보이지만, 몇번 보니까 조금은? 익숙해지는 거 같기도 하다..
다음은 메인에서의 호출 내용을 확인 해보자
int(*(*p)(void))(int) = func3;
p 라는 함수 포인터 변수를 선언하는 부분이다.
원하는 함수는 리턴형이 리턴값을 int형으로 가지며 매개변수를 int형을 갖는 함수포인터 이고,
자신의 매개변수는 void인 함수이다.
이후 호출 내용은 직접 확인 해볼 수 있도록 printf의 순서를 확인하자.
그래도 헷갈리는거 같다... ㅠㅠ
'이론 > C/C++' 카테고리의 다른 글
간단한 함수 포인터 예제 (0) | 2015.06.16 |
---|---|
C/C++ 시간 정보 얻기 (0) | 2015.03.08 |
C++ 문자열 너비포함 출력 (0) | 2015.03.08 |
C++에서 2차원 배열 동적할당, 반납 (0) | 2015.01.10 |