함수포인터 활용

이론/C/C++ 2016. 10. 27. 01:36 |

함수 포인터에 대한 정의 이다.

일반 포인터가 변수에 대한 주소를 가지고, 변수를 가리킬 수 있는것 처럼 함수, 즉 실행가능한 코드를 가리키고 있는 포인터이다.


위키에서의 예시를 먼저 확인 해본다면

func1 은 하나의 더블형 매개변수를 가지며, 다른 더블형을 반환한다.
(기능은 센티미터를 인치로 변환하게 된다)
func2 는 정수형, 상수 문자 배열에 대한 포인터를 매개변수로 가진다. 그리고 문자에 대한 포인터를 반환한다.
(기능은 문자배열에서 주어진 문자의 첫번째 발생에 대한 포인터를 반환하는 문자열 라이브러리 함수의 역할이다.)

함수 포인터로 선언 하는 방법은 :  함수의 리턴형  (*함수포인터명)(매개변수); 이런 식으로 된다
선언된 함수 포인터에 수포인터명 = 원하는 함수 방식으로 사용할 수 있게 되는 것이다.

이제 이 함수포인터 들을 조금 더 꼬아서 작성 해보자.


함수포인터가 익숙하지 않는 상태에선 이해하기 힘든 코드로 보인다. 그러니 하나씩 뜯어보자.

(실제로 이렇게 쓰는 경우도 있다고 어디서 듣긴했다...)


먼저 함수 선언부를 보자면

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
Posted by *me
: