함수 포인터란 함수를 포인터로 받는 것을 의미한다.
그냥 포인터도 헷갈리는데 함수포인터는  모양까지 어려워 보여 많이 헷갈리게 한다는 것은 엄연한 사실이고
많은 분들이 여기서 머리에 두통을 느끼실 것이다.

하지만 결론적으로는 함수포인터는 함수의 주소를 받는 4byte의 크기를 가지는 포인터 변수것이고 이 주소를 통해서 값을 넘기고
받는 것이다.

이 소스는 EHW라는 함수를 fP라는 함수 포인터(fP는 function pointer의 약자쯤 되겠다)로 받아서
함수의 주소와 함수포인터의 값을 출력해보고 이 출력값을 이용해서
주석 처리한 부분에 그 출력값을 이용해서 함수를 호출해보는 정상적인 함수호출이 아니지만
함수도 결국 주소에 불과다하는 것을 보여주기 위한 소스이다.
그럼 함수 포인터를 보는 방법을 말해보기위해 위의 소스를 예를 들어 설명을 해 보겠다.

어떤 변수든 그 변수를 선언할때 데이터 타입을 같이 선언해 주어야 한다는 것은 기본이다.
우리의 눈을 어지럽게 하는 것은 바로 그 함수 포인터의 데이터 타입(Data type)부분 인 것이다.
이 부분만 이해를 한다면 함수 포인터는 그냥 포인터일 뿐이다.

그럼 함수 포인터의 데이터 타입은 어떻게 결정 되는가?
우리는 함수를 포인터로 받으려고 하는 것이다. 그럼 함수의 데이터 타입에 함수포인터 변수의 데이터 타입을 맞춰야 한다.
자 결론이 나왔다. R-value의 데이터 타입을 L-value에 맞춰야 한다는 의미이다.
(R-value : 대입연산자에서의 오른쪽 변에 쓰인 값, L-value : 대입연산자의 왼쪽 변에 쓰인 값)

그럼 위의 경우에 함수의 데이터 타입을 알아보자.
일단 선언한 EHW의 함수의 반환형은 void형이다. 그리고 우린 이 함수를 포인터로 받으려고 한다. 또한 이 함수의 인자값은 현재 int형이다.
이 말을 code로 표현 한다면 void(*)(int)가 될것이다.

그럼 다 끝난 것이다. 이 포인터를 함수 포인터형 변수로 쓸 변수 fP로 받으면 되는것이다.
void (*fP)(int) = EHW; // 이 부분이 소스 중간에 사용된다면 명시적 형변환의 일종이 될 것이다.
이렇게 말이다.

설명이 어렵다고 느껴지거나 잘못 됬다고 생각 되는 점이 있으면 덧글을 달아 주시기 바랍니다.

+ Recent posts